Skip to content

Commit b8db291

Browse files
committed
fix[member test]: 로직 변경으로 인한 테스트 코드 수정
1 parent 0392bbb commit b8db291

File tree

2 files changed

+61
-65
lines changed

2 files changed

+61
-65
lines changed

backend/src/test/java/com/ai/lawyer/domain/member/controller/MemberControllerTest.java

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@ void setUp() {
6868
signupRequest = MemberSignupRequest.builder()
6969
.loginId("[email protected]")
7070
.password("password123")
71-
.nickname("tester")
7271
.age(25)
7372
.gender(Member.Gender.MALE)
7473
.name("테스트")
@@ -82,7 +81,6 @@ void setUp() {
8281
memberResponse = MemberResponse.builder()
8382
.memberId(1L)
8483
.loginId("[email protected]")
85-
.nickname("tester")
8684
.age(25)
8785
.gender(Member.Gender.MALE)
8886
.name("테스트")
@@ -111,7 +109,6 @@ void signup_Success() throws Exception {
111109
.andExpect(status().isCreated())
112110
.andExpect(jsonPath("$.memberId").value(1L))
113111
.andExpect(jsonPath("$.loginId").value("[email protected]"))
114-
.andExpect(jsonPath("$.nickname").value("tester"))
115112
.andExpect(jsonPath("$.age").value(25))
116113
.andExpect(jsonPath("$.gender").value("MALE"))
117114
.andExpect(jsonPath("$.name").value("테스트"))
@@ -145,7 +142,6 @@ void signup_Fail_ValidationError() throws Exception {
145142
MemberSignupRequest invalidRequest = MemberSignupRequest.builder()
146143
.loginId("invalid-email") // 잘못된 이메일 형식
147144
.password("123") // 너무 짧은 비밀번호
148-
.nickname("") // 빈 닉네임
149145
.age(10) // 최소 나이 미만
150146
.gender(Member.Gender.MALE)
151147
.name("") // 빈 이름
@@ -177,8 +173,7 @@ void login_Success() throws Exception {
177173
.andDo(print())
178174
.andExpect(status().isOk())
179175
.andExpect(jsonPath("$.memberId").value(1L))
180-
.andExpect(jsonPath("$.loginId").value("[email protected]"))
181-
.andExpect(jsonPath("$.nickname").value("tester"));
176+
.andExpect(jsonPath("$.loginId").value("[email protected]"));
182177

183178
verify(memberService).login(any(MemberLoginRequest.class), any());
184179
}
@@ -220,22 +215,35 @@ void login_Fail_PasswordMismatch() throws Exception {
220215
}
221216

222217
@Test
223-
@DisplayName("로그아웃 성공")
224-
void logout_Success() throws Exception {
218+
@DisplayName("로그아웃 성공 - Authentication에서 loginId 추출하여 Redis 삭제")
219+
void logout_Success() {
225220
// given
226-
doNothing().when(memberService).logout(any());
221+
doNothing().when(memberService).logout(eq("[email protected]"), eq(response));
227222

228-
// when and then
229-
mockMvc.perform(post("/api/auth/logout")
230-
.with(csrf()))
231-
.andDo(print())
232-
.andExpect(status().isOk());
223+
// when
224+
ResponseEntity<Void> result = memberController.logout(authentication, response);
225+
226+
// then
227+
assertThat(result.getStatusCode()).isEqualTo(HttpStatus.OK);
228+
verify(memberService).logout(eq("[email protected]"), eq(response));
229+
}
233230

234-
verify(memberService).logout(any());
231+
@Test
232+
@DisplayName("로그아웃 성공 - 인증되지 않은 상태에서도 쿠키 클리어")
233+
void logout_Success_Unauthenticated() {
234+
// given
235+
doNothing().when(memberService).logout(eq(""), eq(response));
236+
237+
// when
238+
ResponseEntity<Void> result = memberController.logout(null, response);
239+
240+
// then
241+
assertThat(result.getStatusCode()).isEqualTo(HttpStatus.OK);
242+
verify(memberService).logout(eq(""), eq(response));
235243
}
236244

237245
@Test
238-
@DisplayName("토큰 재발급 성공")
246+
@DisplayName("토큰 재발급 성공 - 쿠키에서 Refresh Token 추출하여 Redis 검증")
239247
void refreshToken_Success() {
240248
// given
241249
Cookie[] cookies = {new Cookie("refreshToken", "validRefreshToken")};
@@ -249,6 +257,8 @@ void refreshToken_Success() {
249257
// then
250258
assertThat(result.getStatusCode()).isEqualTo(HttpStatus.OK);
251259
assertThat(result.getBody()).isEqualTo(memberResponse);
260+
261+
// 쿠키에서 refreshToken이 정상적으로 추출되어 서비스에 전달되는지 검증
252262
verify(memberService).refreshToken(eq("validRefreshToken"), eq(response));
253263
}
254264

@@ -293,7 +303,7 @@ void withdraw_Success() {
293303
.build();
294304
given(memberService.findByLoginId("[email protected]")).willReturn(mockMember);
295305
doNothing().when(memberService).withdraw(1L);
296-
doNothing().when(memberService).logout(eq(response));
306+
doNothing().when(memberService).logout(eq("[email protected]"), eq(response));
297307

298308
// when
299309
ResponseEntity<Void> result = memberController.withdraw(authentication, response);
@@ -302,7 +312,7 @@ void withdraw_Success() {
302312
assertThat(result.getStatusCode()).isEqualTo(HttpStatus.OK);
303313
verify(memberService).findByLoginId("[email protected]");
304314
verify(memberService).withdraw(1L);
305-
verify(memberService).logout(eq(response));
315+
verify(memberService).logout(eq("[email protected]"), eq(response));
306316
}
307317

308318
@Test
@@ -314,7 +324,7 @@ void withdraw_Fail_Unauthenticated() {
314324
// then
315325
assertThat(result.getStatusCode()).isEqualTo(HttpStatus.UNAUTHORIZED);
316326
verify(memberService, never()).withdraw(anyLong());
317-
verify(memberService, never()).logout(any());
327+
verify(memberService, never()).logout(anyString(), any());
318328
}
319329

320330
@Test
@@ -331,7 +341,7 @@ void withdraw_Fail_MemberNotFound() {
331341
assertThat(result.getStatusCode()).isEqualTo(HttpStatus.NOT_FOUND);
332342
verify(memberService).findByLoginId("[email protected]");
333343
verify(memberService, never()).withdraw(anyLong());
334-
verify(memberService, never()).logout(any());
344+
verify(memberService, never()).logout(anyString(), any());
335345
}
336346

337347
@Test

backend/src/test/java/com/ai/lawyer/domain/member/service/MemberServiceTest.java

Lines changed: 31 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@ void setUp() {
6161
signupRequest = MemberSignupRequest.builder()
6262
.loginId("[email protected]")
6363
.password("password123")
64-
.nickname("tester")
6564
.age(25)
6665
.gender(Member.Gender.MALE)
6766
.name("테스트")
@@ -76,7 +75,6 @@ void setUp() {
7675
.memberId(1L)
7776
.loginId("[email protected]")
7877
.password("encodedPassword")
79-
.nickname("tester")
8078
.age(25)
8179
.gender(Member.Gender.MALE)
8280
.name("테스트")
@@ -89,10 +87,9 @@ void setUp() {
8987
void signup_Success() {
9088
// given
9189
log.info("=== 회원가입 성공 테스트 시작 ===");
92-
log.info("테스트 데이터: 이메일={}, 닉네임={}", signupRequest.getLoginId(), signupRequest.getNickname());
90+
log.info("테스트 데이터: 이메일={}", signupRequest.getLoginId());
9391

9492
given(memberRepository.existsByLoginId(signupRequest.getLoginId())).willReturn(false);
95-
given(memberRepository.existsByNickname(signupRequest.getNickname())).willReturn(false);
9693
given(passwordEncoder.encode(signupRequest.getPassword())).willReturn("encodedPassword");
9794
given(memberRepository.save(any(Member.class))).willReturn(member);
9895
log.info("Mock 설정 완료: 이메일 중복 없음, 닉네임 중복 없음, 비밀번호 인코딩 성공");
@@ -106,7 +103,6 @@ void signup_Success() {
106103
log.info("검증 시작: 반환된 회원 정보 확인");
107104
assertThat(result).as("회원가입 결과가 null이 아님").isNotNull();
108105
assertThat(result.getLoginId()).as("로그인 ID 일치").isEqualTo("[email protected]");
109-
assertThat(result.getNickname()).as("닉네임 일치").isEqualTo("tester");
110106
assertThat(result.getAge()).as("나이 일치").isEqualTo(25);
111107
assertThat(result.getGender()).as("성별 일치").isEqualTo(Member.Gender.MALE);
112108
assertThat(result.getName()).as("이름 일치").isEqualTo("테스트");
@@ -115,9 +111,6 @@ void signup_Success() {
115111

116112
log.info(MOCK_VERIFICATION_START_LOG);
117113
verify(memberRepository).existsByLoginId(signupRequest.getLoginId());
118-
log.info("이메일 중복 체크 호출 확인");
119-
verify(memberRepository).existsByNickname(signupRequest.getNickname());
120-
log.info("닉네임 중복 체크 호출 확인");
121114
verify(passwordEncoder).encode(signupRequest.getPassword());
122115
log.info("비밀번호 인코딩 호출 확인");
123116
verify(memberRepository).save(any(Member.class));
@@ -148,34 +141,13 @@ void signup_Fail_DuplicateEmail() {
148141

149142
log.info("호출 검증: 이메일 중복으로 인한 early return 확인");
150143
verify(memberRepository).existsByLoginId(signupRequest.getLoginId());
151-
log.info("이메일 중복 체크 호출됨");
152-
verify(memberRepository, never()).existsByNickname(anyString());
153-
log.info("닉네임 체크는 호출되지 않음 (이메일 중복으로 early return)");
154144
verify(passwordEncoder, never()).encode(anyString());
155145
log.info("비밀번호 인코딩 호출되지 않음");
156146
verify(memberRepository, never()).save(any(Member.class));
157147
log.info("회원 저장 호출되지 않음");
158148
log.info("=== 회원가입 실패(이메일 중복) 테스트 완료 ===");
159149
}
160150

161-
@Test
162-
@DisplayName("회원가입 실패 - 닉네임 중복")
163-
void signup_Fail_DuplicateNickname() {
164-
// given
165-
given(memberRepository.existsByLoginId(signupRequest.getLoginId())).willReturn(false);
166-
given(memberRepository.existsByNickname(signupRequest.getNickname())).willReturn(true);
167-
168-
// when and then
169-
assertThatThrownBy(() -> memberService.signup(signupRequest))
170-
.isInstanceOf(IllegalArgumentException.class)
171-
.hasMessage("이미 존재하는 닉네임입니다.");
172-
173-
verify(memberRepository).existsByLoginId(signupRequest.getLoginId());
174-
verify(memberRepository).existsByNickname(signupRequest.getNickname());
175-
verify(passwordEncoder, never()).encode(anyString());
176-
verify(memberRepository, never()).save(any(Member.class));
177-
}
178-
179151
@Test
180152
@DisplayName("로그인 성공")
181153
void login_Success() {
@@ -259,12 +231,12 @@ void refreshToken_Success() {
259231
String refreshToken = "validRefreshToken";
260232
log.info("리프레시 토큰: {}", refreshToken);
261233

262-
given(tokenProvider.validateToken(refreshToken)).willReturn(true);
263-
given(tokenProvider.getUsernameFromToken(refreshToken)).willReturn("[email protected]");
234+
given(tokenProvider.findUsernameByRefreshToken(refreshToken)).willReturn("[email protected]");
235+
given(tokenProvider.validateRefreshToken("[email protected]", refreshToken)).willReturn(true);
264236
given(memberRepository.findByLoginId("[email protected]")).willReturn(Optional.of(member));
265237
given(tokenProvider.generateAccessToken(member)).willReturn("newAccessToken");
266238
given(tokenProvider.generateRefreshToken(member)).willReturn("newRefreshToken");
267-
log.info("Mock 설정 완료: 토큰 유효, 회원 존재, 새 토큰 생성 준비");
239+
log.info("Mock 설정 완료: Redis 토큰 유효, 회원 존재, 새 토큰 생성 준비");
268240

269241
// when
270242
log.info("토큰 재발급 서비스 호출 중...");
@@ -277,19 +249,21 @@ void refreshToken_Success() {
277249
assertThat(result.getLoginId()).as("재발급된 토큰의 회원 이메일 일치").isEqualTo("[email protected]");
278250
log.info("토큰 재발급 결과 검증 완료");
279251

280-
log.info("{}: RTR(Refresh Token Rotation) 패턴 확인", MOCK_VERIFICATION_START_LOG);
281-
verify(tokenProvider).validateToken(refreshToken);
282-
log.info("1단계: 리프레시 토큰 유효성 검증");
283-
verify(tokenProvider).getUsernameFromToken(refreshToken);
284-
log.info("2단계: 토큰에서 사용자명 추출");
252+
log.info("{}: RTR(Refresh Token Rotation) 패턴 및 Redis 검증", MOCK_VERIFICATION_START_LOG);
253+
verify(tokenProvider).findUsernameByRefreshToken(refreshToken);
254+
log.info("1단계: Redis에서 refreshToken 으로 사용자명 찾기");
255+
verify(tokenProvider).validateRefreshToken("[email protected]", refreshToken);
256+
log.info("2단계: Redis에서 리프레시 토큰 유효성 검증");
285257
verify(memberRepository).findByLoginId("[email protected]");
286258
log.info("3단계: 회원 정보 조회");
259+
verify(tokenProvider).deleteRefreshToken("[email protected]");
260+
log.info("4단계: 기존 리프레시 토큰 Redis에서 삭제 (RTR 패턴)");
287261
verify(tokenProvider).generateAccessToken(member);
288-
log.info("4단계: 새 액세스 토큰 생성");
262+
log.info("5단계: 새 액세스 토큰 생성");
289263
verify(tokenProvider).generateRefreshToken(member);
290-
log.info("5단계: 새 리프레시 토큰 생성 (RTR 패턴)");
264+
log.info("6단계: 새 리프레시 토큰 생성 후 Redis에 저장 (RTR 패턴)");
291265
verify(cookieUtil).setTokenCookies(response, "newAccessToken", "newRefreshToken");
292-
log.info("6단계: 새 토큰들을 쿠키로 설정");
266+
log.info("7단계: 새 토큰들을 쿠키로 설정");
293267
log.info("=== 토큰 재발급 성공 테스트 완료 ===");
294268
}
295269

@@ -298,15 +272,15 @@ void refreshToken_Success() {
298272
void refreshToken_Fail_InvalidToken() {
299273
// given
300274
String refreshToken = "invalidRefreshToken";
301-
given(tokenProvider.validateToken(refreshToken)).willReturn(false);
275+
given(tokenProvider.findUsernameByRefreshToken(refreshToken)).willReturn(null);
302276

303277
// when and then
304278
assertThatThrownBy(() -> memberService.refreshToken(refreshToken, response))
305279
.isInstanceOf(IllegalArgumentException.class)
306280
.hasMessage("유효하지 않은 리프레시 토큰입니다.");
307281

308-
verify(tokenProvider).validateToken(refreshToken);
309-
verify(tokenProvider, never()).getUsernameFromToken(anyString());
282+
verify(tokenProvider).findUsernameByRefreshToken(refreshToken);
283+
verify(tokenProvider, never()).validateRefreshToken(anyString(), anyString());
310284
verify(memberRepository, never()).findByLoginId(anyString());
311285
verify(cookieUtil, never()).setTokenCookies(any(), anyString(), anyString());
312286
}
@@ -376,12 +350,24 @@ void getMemberById_Fail_MemberNotFound() {
376350
}
377351

378352
@Test
379-
@DisplayName("로그아웃 성공")
353+
@DisplayName("로그아웃 성공 - Redis 토큰 삭제 및 쿠키 클리어")
380354
void logout_Success() {
355+
// given
356+
log.info("=== 로그아웃 성공 테스트 시작 ===");
357+
String loginId = "[email protected]";
358+
log.info("로그아웃 대상 사용자: {}", loginId);
359+
381360
// when
382-
memberService.logout(response);
361+
log.info("로그아웃 서비스 호출 중...");
362+
memberService.logout(loginId, response);
363+
log.info("로그아웃 완료");
383364

384365
// then
366+
log.info("검증 시작: Redis 토큰 삭제 및 쿠키 클리어 확인");
367+
verify(tokenProvider).deleteRefreshToken(loginId);
368+
log.info("Redis에서 리프레시 토큰 삭제 호출 확인");
385369
verify(cookieUtil).clearTokenCookies(response);
370+
log.info("쿠키에서 토큰 클리어 호출 확인");
371+
log.info("=== 로그아웃 성공 테스트 완료 ===");
386372
}
387373
}

0 commit comments

Comments
 (0)