Skip to content

Commit b9d9541

Browse files
committed
Fix: 테스트 관련 빌드 오류 수정
1. 문제 원인 - @SuperBuilder는 필드 초기값(ex. new ArrayList<>())을 무시하여, 빌더로 생성된 객체의 컬렉션 필드가 null이 되는 문제가 있었음. - 이로 인해 테스트 환경에서 NullPointerException 및 DB ConstraintViolationException (NOT NULL 제약 조건 위반)이 연쇄적으로 발생함. - 일부 테스트에서는 엔티티 필드명(userProfile)과 다른 이름(userProfiles)을 리플렉션으로 참조하여 NoSuchFieldException이 발생함. 2. 해결 방법 - @Builder.Default 적용 : Room, User 등 @SuperBuilder를 사용하는 모든 엔티티의 컬렉션 필드 및 초기값을 가진 필드에 @Builder.Default 어노테이션을 추가함. 이를 통해 빌더 사용 시에도 필드가 null이 아닌 기본값으로 안전하게 초기화되도록 보장함. - 테스트 코드 수정 : ChatWebSocketControllerTest에서 User의 userProfile 필드를 잘못된 이름("userProfiles")으로 참조하던 리플렉션 코드를 수정함.
1 parent 5b25afe commit b9d9541

File tree

4 files changed

+37
-9
lines changed

4 files changed

+37
-9
lines changed

src/main/java/com/back/domain/studyroom/entity/Room.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.back.global.entity.BaseEntity;
66
import jakarta.persistence.*;
77
import lombok.AllArgsConstructor;
8+
import lombok.Builder;
89
import lombok.Getter;
910
import lombok.NoArgsConstructor;
1011
import lombok.experimental.SuperBuilder;
@@ -29,31 +30,43 @@ public class Room extends BaseEntity {
2930
private boolean allowScreenShare;
3031

3132
// 방 상태
33+
@Builder.Default
3234
@Enumerated(EnumType.STRING)
3335
@Column(nullable = false)
3436
private RoomStatus status = RoomStatus.WAITING;
37+
3538
// 현재 참여자
39+
@Builder.Default
3640
@Column(nullable = false)
3741
private int currentParticipants = 0;
42+
3843
// 방장
3944
@ManyToOne(fetch = FetchType.LAZY)
4045
@JoinColumn(name = "created_by")
4146
private User createdBy;
47+
4248
// 테마
4349
@ManyToOne(fetch = FetchType.LAZY)
4450
@JoinColumn(name = "theme_id")
4551
private RoomTheme theme;
4652

4753
// 연관관계 설정
54+
@Builder.Default
4855
@OneToMany(mappedBy = "room", cascade = CascadeType.ALL, orphanRemoval = true)
4956
private List<RoomMember> roomMembers = new ArrayList<>();
57+
5058
// 채팅 메시지
59+
@Builder.Default
5160
@OneToMany(mappedBy = "room", cascade = CascadeType.ALL, orphanRemoval = true)
5261
private List<RoomChatMessage> roomChatMessages = new ArrayList<>();
62+
5363
// 참가자 기록
64+
@Builder.Default
5465
@OneToMany(mappedBy = "room", cascade = CascadeType.ALL, orphanRemoval = true)
5566
private List<RoomParticipantHistory> roomParticipantHistories = new ArrayList<>();
67+
5668
// 스터디 기록
69+
@Builder.Default
5770
@OneToMany(mappedBy = "room", cascade = CascadeType.ALL, orphanRemoval = true)
5871
public List<StudyRecord> studyRecords = new ArrayList<>();
5972

src/main/java/com/back/domain/user/entity/User.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.back.global.entity.BaseEntity;
1111
import jakarta.persistence.*;
1212
import lombok.AllArgsConstructor;
13+
import lombok.Builder;
1314
import lombok.Getter;
1415
import lombok.NoArgsConstructor;
1516
import lombok.experimental.SuperBuilder;
@@ -43,45 +44,59 @@ public class User extends BaseEntity {
4344
@OneToOne(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
4445
private UserProfile userProfile;
4546

47+
@Builder.Default
4648
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
4749
private List<UserToken> userTokens = new ArrayList<>();
4850

51+
@Builder.Default
4952
@OneToMany(mappedBy = "fromUser", cascade = CascadeType.ALL, orphanRemoval = true)
5053
private List<PrivateChatMessage> sentMessages = new ArrayList<>();
5154

55+
@Builder.Default
5256
@OneToMany(mappedBy = "toUser", cascade = CascadeType.ALL, orphanRemoval = true)
5357
private List<PrivateChatMessage> receivedMessages = new ArrayList<>();
5458

59+
@Builder.Default
5560
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
5661
private List<RoomMember> roomMembers = new ArrayList<>();
5762

63+
@Builder.Default
5864
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
5965
private List<RoomChatMessage> roomChatMessages = new ArrayList<>();
6066

67+
@Builder.Default
6168
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
6269
private List<RoomParticipantHistory> roomParticipantHistories = new ArrayList<>();
6370

71+
@Builder.Default
6472
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
6573
private List<StudyPlan> studyPlans = new ArrayList<>();
6674

75+
@Builder.Default
6776
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
6877
private List<Todo> todos = new ArrayList<>();
6978

79+
@Builder.Default
7080
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
7181
private List<Post> posts = new ArrayList<>();
7282

83+
@Builder.Default
7384
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
7485
private List<PostLike> postLikes = new ArrayList<>();
7586

87+
@Builder.Default
7688
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
7789
private List<PostBookmark> postBookmarks = new ArrayList<>();
7890

91+
@Builder.Default
7992
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
8093
private List<Comment> comments = new ArrayList<>();
8194

95+
@Builder.Default
8296
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
8397
private List<CommentLike> commentLikes = new ArrayList<>();
8498

99+
@Builder.Default
85100
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
86101
private List<FileAttachment> fileAttachments = new ArrayList<>();
87102

src/test/java/com/back/domain/chat/controller/ChatWebSocketControllerTest.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,8 @@ void setUp() throws Exception {
7272
7373
.build();
7474

75-
// 리플렉션으로 userProfiles 필드 설정
76-
setUserProfiles(mockUser, Arrays.asList(mockUserProfile));
75+
// 리플렉션으로 userProfile 필드 설정
76+
setUserProfile(mockUser, mockUserProfile);
7777

7878
// Mock RoomChatMessage 생성
7979
mockSavedMessage = RoomChatMessage.builder()
@@ -97,10 +97,10 @@ private UserProfile createUserProfile(String nickname, String profileImageUrl) t
9797
}
9898

9999
// User의 userProfiles 필드 설정
100-
private void setUserProfiles(User user, List<UserProfile> profiles) throws Exception {
101-
Field userProfilesField = User.class.getDeclaredField("userProfiles");
100+
private void setUserProfile(User user, UserProfile profile) throws Exception {
101+
Field userProfilesField = User.class.getDeclaredField("userProfile");
102102
userProfilesField.setAccessible(true);
103-
userProfilesField.set(user, profiles);
103+
userProfilesField.set(user, profile);
104104
}
105105

106106
// 리플렉션으로 필드 값 설정하는 헬퍼 메소드

src/test/java/com/back/domain/chat/service/ChatServiceTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ void setUp() throws Exception {
6969
.build();
7070

7171
// 리플렉션으로 userProfiles 필드 설정
72-
setUserProfiles(testUser, Arrays.asList(testUserProfile));
72+
setUserProfile(testUser, testUserProfile);
7373

7474
testRoom = Room.builder()
7575
.id(1L)
@@ -99,10 +99,10 @@ private UserProfile createUserProfile(String nickname, String profileImageUrl) t
9999
}
100100

101101
// User의 userProfiles 필드 설정
102-
private void setUserProfiles(User user, List<UserProfile> profiles) throws Exception {
103-
Field userProfilesField = User.class.getDeclaredField("userProfiles");
102+
private void setUserProfile(User user, UserProfile profile) throws Exception {
103+
Field userProfilesField = User.class.getDeclaredField("userProfile");
104104
userProfilesField.setAccessible(true);
105-
userProfilesField.set(user, profiles);
105+
userProfilesField.set(user, profile);
106106
}
107107

108108
// 리플렉션으로 필드 값 설정하는 헬퍼 메소드

0 commit comments

Comments
 (0)