@@ -61,7 +61,6 @@ void setUp() {
6161 signupRequest = MemberSignupRequest .builder ()
62626363 .password ("password123" )
64- .nickname ("tester" )
6564 .age (25 )
6665 .gender (Member .Gender .MALE )
6766 .name ("테스트" )
@@ -76,7 +75,6 @@ void setUp() {
7675 .memberId (1L )
77767877 .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