Skip to content

Commit 49ba156

Browse files
committed
fix[JWT]: 토큰 생성과 재발급에 관한 로직의 변경으로 인한 테스트 코드 수정
1 parent fbf545a commit 49ba156

File tree

5 files changed

+181
-114
lines changed

5 files changed

+181
-114
lines changed

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ public String getName() {
108108
@DisplayName("회원가입 성공")
109109
void signup_Success() throws Exception {
110110
// given
111-
given(memberService.signup(any(MemberSignupRequest.class))).willReturn(memberResponse);
111+
given(memberService.signup(any(MemberSignupRequest.class), any(HttpServletResponse.class))).willReturn(memberResponse);
112112

113113
// when and then
114114
mockMvc.perform(post("/api/auth/signup")
@@ -124,13 +124,13 @@ void signup_Success() throws Exception {
124124
.andExpect(jsonPath("$.name").value("테스트"))
125125
.andExpect(jsonPath("$.role").value("USER"));
126126

127-
verify(memberService).signup(any(MemberSignupRequest.class));
127+
verify(memberService).signup(any(MemberSignupRequest.class), any(HttpServletResponse.class));
128128
}
129129

130130
@Test
131131
@DisplayName("회원가입 실패 - 이메일 중복")
132132
void signup_Fail_DuplicateEmail() throws Exception {
133-
given(memberService.signup(any(MemberSignupRequest.class)))
133+
given(memberService.signup(any(MemberSignupRequest.class), any(HttpServletResponse.class)))
134134
.willThrow(new IllegalArgumentException("이미 존재하는 이메일입니다."));
135135

136136
mockMvc.perform(post("/api/auth/signup")
@@ -140,7 +140,7 @@ void signup_Fail_DuplicateEmail() throws Exception {
140140
.andDo(print())
141141
.andExpect(status().isBadRequest());
142142

143-
verify(memberService).signup(any(MemberSignupRequest.class));
143+
verify(memberService).signup(any(MemberSignupRequest.class), any(HttpServletResponse.class));
144144
}
145145

146146
@Test
@@ -163,7 +163,7 @@ void signup_Fail_ValidationError() throws Exception {
163163
.andDo(print())
164164
.andExpect(status().isBadRequest());
165165

166-
verify(memberService, never()).signup(any(MemberSignupRequest.class));
166+
verify(memberService, never()).signup(any(MemberSignupRequest.class), any(HttpServletResponse.class));
167167
}
168168

169169
@Test

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

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ void signup_Success() {
102102

103103
// when
104104
log.info("회원가입 서비스 호출 중...");
105-
MemberResponse result = memberService.signup(signupRequest);
105+
MemberResponse result = memberService.signup(signupRequest, response);
106106
log.info("회원가입 완료: memberId={}", result.getMemberId());
107107

108108
// then
@@ -138,7 +138,7 @@ void signup_Fail_DuplicateEmail() {
138138
log.info("예외 발생 검증 시작");
139139
assertThatThrownBy(() -> {
140140
log.info("회원가입 시도 중... (실패 예상)");
141-
memberService.signup(signupRequest);
141+
memberService.signup(signupRequest, response);
142142
})
143143
.as("이메일 중복 시 IllegalArgumentException 발생")
144144
.isInstanceOf(IllegalArgumentException.class)
@@ -262,8 +262,8 @@ void refreshToken_Success() {
262262
log.info("2단계: Redis에서 리프레시 토큰 유효성 검증");
263263
verify(memberRepository).findByLoginId("[email protected]");
264264
log.info("3단계: 회원 정보 조회");
265-
verify(tokenProvider).deleteRefreshToken("[email protected]");
266-
log.info("4단계: 기존 리프레시 토큰 Redis에서 삭제 (RTR 패턴)");
265+
verify(tokenProvider).deleteAllTokens("[email protected]");
266+
log.info("4단계: 기존 모든 토큰 Redis에서 삭제 (RTR 패턴)");
267267
verify(tokenProvider).generateAccessToken(member);
268268
log.info("5단계: 새 액세스 토큰 생성");
269269
verify(tokenProvider).generateRefreshToken(member);
@@ -370,8 +370,8 @@ void logout_Success() {
370370

371371
// then
372372
log.info("검증 시작: Redis 토큰 삭제 및 쿠키 클리어 확인");
373-
verify(tokenProvider).deleteRefreshToken(loginId);
374-
log.info("Redis에서 리프레시 토큰 삭제 호출 확인");
373+
verify(tokenProvider).deleteAllTokens(loginId);
374+
log.info("Redis에서 모든 토큰 삭제 호출 확인");
375375
verify(cookieUtil).clearTokenCookies(response);
376376
log.info("쿠키에서 토큰 클리어 호출 확인");
377377
log.info("=== 로그아웃 성공 테스트 완료 ===");
@@ -499,7 +499,7 @@ void resetPassword_Success() {
499499
given(memberRepository.findByLoginId(loginId)).willReturn(Optional.of(member));
500500
given(emailAuthService.isEmailVerified(loginId)).willReturn(true); // Redis 인증 성공
501501
given(passwordEncoder.encode(newPassword)).willReturn("encodedNewPassword");
502-
doNothing().when(tokenProvider).deleteRefreshToken(loginId);
502+
doNothing().when(tokenProvider).deleteAllTokens(loginId);
503503
doNothing().when(emailAuthService).clearAuthData(loginId);
504504
log.info("Mock 설정 완료: 회원 존재, 클라이언트 인증 성공, Redis 인증 성공, 비밀번호 인코딩 준비");
505505

@@ -520,8 +520,8 @@ void resetPassword_Success() {
520520
log.info("회원 정보 저장 호출 확인");
521521
verify(emailAuthService).clearAuthData(loginId);
522522
log.info("인증 데이터 삭제 호출 확인");
523-
verify(tokenProvider).deleteRefreshToken(loginId);
524-
log.info("기존 리프레시 토큰 삭제 호출 확인 (보안상 로그아웃 처리)");
523+
verify(tokenProvider).deleteAllTokens(loginId);
524+
log.info("기존 모든 토큰 삭제 호출 확인 (보안상 로그아웃 처리)");
525525
log.info("=== 비밀번호 재설정 성공 테스트 완료 ===");
526526
}
527527

@@ -545,7 +545,7 @@ void resetPassword_Fail_ClientSuccessFalse() {
545545
verify(emailAuthService, never()).isEmailVerified(anyString());
546546
verify(passwordEncoder, never()).encode(anyString());
547547
verify(memberRepository, never()).save(any(Member.class));
548-
verify(tokenProvider, never()).deleteRefreshToken(anyString());
548+
verify(tokenProvider, never()).deleteAllTokens(anyString());
549549
}
550550

551551
@Test
@@ -567,7 +567,7 @@ void resetPassword_Fail_RedisNotVerified() {
567567
verify(emailAuthService).isEmailVerified(loginId);
568568
verify(passwordEncoder, never()).encode(anyString());
569569
verify(memberRepository, never()).save(any(Member.class));
570-
verify(tokenProvider, never()).deleteRefreshToken(anyString());
570+
verify(tokenProvider, never()).deleteAllTokens(anyString());
571571
}
572572

573573
@Test
@@ -587,7 +587,7 @@ void resetPassword_Fail_NullSuccess() {
587587
verify(memberRepository).findByLoginId(loginId);
588588
verify(passwordEncoder, never()).encode(anyString());
589589
verify(memberRepository, never()).save(any(Member.class));
590-
verify(tokenProvider, never()).deleteRefreshToken(anyString());
590+
verify(tokenProvider, never()).deleteAllTokens(anyString());
591591
}
592592

593593
@Test
@@ -607,7 +607,7 @@ void resetPassword_Fail_MemberNotFound() {
607607
verify(memberRepository).findByLoginId(loginId);
608608
verify(passwordEncoder, never()).encode(anyString());
609609
verify(memberRepository, never()).save(any(Member.class));
610-
verify(tokenProvider, never()).deleteRefreshToken(anyString());
610+
verify(tokenProvider, never()).deleteAllTokens(anyString());
611611
}
612612

613613
@Test

backend/src/test/java/com/ai/lawyer/domain/poll/controller/PollControllerTest.java

Lines changed: 50 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,23 @@
22

33
import com.ai.lawyer.domain.poll.service.PollService;
44
import org.junit.jupiter.api.Test;
5+
import org.junit.jupiter.api.BeforeEach;
56
import org.mockito.Mockito;
67
import org.springframework.beans.factory.annotation.Autowired;
78
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
9+
import org.springframework.test.context.bean.override.mockito.MockitoBean;
810
import org.springframework.test.web.servlet.MockMvc;
911
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
1012
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
11-
import org.springframework.security.core.Authentication;
12-
import org.springframework.security.core.context.SecurityContextHolder;
13-
import org.springframework.security.core.context.SecurityContext;
14-
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
1513
import com.ai.lawyer.domain.poll.dto.PollDto;
1614
import com.ai.lawyer.domain.poll.dto.PollVoteDto;
17-
import com.fasterxml.jackson.databind.ObjectMapper;
18-
import org.mockito.Mock;
19-
import org.springframework.boot.test.mock.mockito.MockBean;
2015
import org.springframework.context.annotation.Import;
2116
import com.ai.lawyer.global.security.SecurityConfig;
22-
import org.springframework.security.test.context.support.WithMockUser;
2317
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
2418
import org.junit.jupiter.api.DisplayName;
19+
import jakarta.servlet.http.Cookie;
20+
import static org.mockito.BDDMockito.*;
21+
import com.ai.lawyer.global.jwt.TokenProvider;
2522

2623
@Import(SecurityConfig.class)
2724
@AutoConfigureMockMvc
@@ -37,132 +34,151 @@
3734
class PollControllerTest {
3835
@Autowired
3936
private MockMvc mockMvc;
40-
@MockBean
37+
@MockitoBean
4138
private PollService pollService;
42-
@MockBean
39+
@MockitoBean
4340
private com.ai.lawyer.domain.post.service.PostService postService;
44-
@Autowired
45-
private ObjectMapper objectMapper;
46-
@MockBean
41+
@MockitoBean
4742
private com.ai.lawyer.global.jwt.TokenProvider tokenProvider;
48-
@MockBean
43+
@MockitoBean
4944
private com.ai.lawyer.global.jwt.CookieUtil cookieUtil;
50-
@MockBean
45+
@MockitoBean
5146
private com.ai.lawyer.domain.member.repositories.MemberRepository memberRepository;
52-
@MockBean
47+
@MockitoBean
5348
private org.springframework.data.jpa.mapping.JpaMetamodelMappingContext jpaMappingContext;
5449

50+
@BeforeEach
51+
void setUp() {
52+
// JWT 필터 모킹 설정 - 쿠키에서 토큰 추출 및 검증
53+
given(cookieUtil.getAccessTokenFromCookies(any())).willReturn("valid-access-token");
54+
given(tokenProvider.validateTokenWithResult("valid-access-token"))
55+
.willReturn(TokenProvider.TokenValidationResult.VALID);
56+
given(tokenProvider.getMemberIdFromToken("valid-access-token")).willReturn(1L);
57+
given(tokenProvider.getRoleFromToken("valid-access-token")).willReturn("USER");
58+
}
59+
5560
@Test
5661
@DisplayName("투표 단일 조회")
57-
@WithMockUser(username="1")
5862
void t1() throws Exception {
5963
Mockito.when(pollService.getPoll(Mockito.anyLong())).thenReturn(null);
60-
mockMvc.perform(get("/api/polls/1"))
64+
65+
mockMvc.perform(get("/api/polls/1")
66+
.cookie(new Cookie("accessToken", "valid-access-token")))
6167
.andExpect(status().isOk());
6268
}
6369

6470
@Test
6571
@DisplayName("투표 옵션 목록 조회")
66-
@WithMockUser(username="1")
6772
void t2() throws Exception {
6873
Mockito.when(pollService.getPollOptions(Mockito.anyLong())).thenReturn(java.util.Collections.emptyList());
69-
mockMvc.perform(get("/api/polls/1/options"))
74+
75+
mockMvc.perform(get("/api/polls/1/options")
76+
.cookie(new Cookie("accessToken", "valid-access-token")))
7077
.andExpect(status().isOk());
7178
}
7279

7380
@Test
7481
@DisplayName("투표하기")
75-
@WithMockUser(username="1")
7682
void t3() throws Exception {
7783
Mockito.when(pollService.vote(Mockito.anyLong(), Mockito.anyLong(), Mockito.anyLong())).thenReturn(null);
84+
7885
mockMvc.perform(
7986
org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post("/api/polls/1/vote")
8087
.param("pollItemsId", "1")
88+
.cookie(new Cookie("accessToken", "valid-access-token"))
8189
).andExpect(status().isOk());
8290
}
8391

8492
@Test
8593
@DisplayName("투표 통계 조회")
86-
@WithMockUser(username="1")
8794
void t4() throws Exception {
8895
Mockito.when(pollService.getPollStatics(Mockito.anyLong())).thenReturn(java.util.Collections.emptyList());
89-
mockMvc.perform(get("/api/polls/1/statics"))
96+
97+
mockMvc.perform(get("/api/polls/1/statics")
98+
.cookie(new Cookie("accessToken", "valid-access-token")))
9099
.andExpect(status().isOk());
91100
}
92101

93102
@Test
94103
@DisplayName("투표 종료")
95-
@WithMockUser(username="1")
96104
void t5() throws Exception {
97105
Mockito.doNothing().when(pollService).closePoll(Mockito.anyLong());
106+
98107
mockMvc.perform(
99108
org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put("/api/polls/1/close")
109+
.cookie(new Cookie("accessToken", "valid-access-token"))
100110
).andExpect(status().isOk());
101111
}
102112

103113
@Test
104114
@DisplayName("투표 삭제")
105-
@WithMockUser(username="1")
106115
void t6() throws Exception {
107116
Mockito.doNothing().when(pollService).deletePoll(Mockito.anyLong());
117+
108118
mockMvc.perform(
109119
org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete("/api/polls/1")
120+
.cookie(new Cookie("accessToken", "valid-access-token"))
110121
).andExpect(status().isOk());
111122
}
112123

113124
@Test
114125
@DisplayName("진행중인 투표 Top 1 조회")
115-
@WithMockUser(username="1")
116126
void t7() throws Exception {
117127
Mockito.when(pollService.getTopPollByStatus(Mockito.any())).thenReturn(null);
118-
mockMvc.perform(get("/api/polls/top/ongoing"))
128+
129+
mockMvc.perform(get("/api/polls/top/ongoing")
130+
.cookie(new Cookie("accessToken", "valid-access-token")))
119131
.andExpect(status().isOk());
120132
}
121133

122134
@Test
123135
@DisplayName("종료된 투표 Top 1 조회")
124-
@WithMockUser(username="1")
125136
void t8() throws Exception {
126137
Mockito.when(pollService.getTopPollByStatus(Mockito.any())).thenReturn(null);
127-
mockMvc.perform(get("/api/polls/top/closed"))
138+
139+
mockMvc.perform(get("/api/polls/top/closed")
140+
.cookie(new Cookie("accessToken", "valid-access-token")))
128141
.andExpect(status().isOk());
129142
}
130143

131144
@Test
132145
@DisplayName("투표 생성")
133-
@WithMockUser(username="1")
134146
void t9() throws Exception {
135147
Mockito.when(pollService.createPoll(Mockito.any(), Mockito.anyLong())).thenReturn(null);
148+
136149
mockMvc.perform(
137150
org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post("/api/polls")
138151
.contentType(org.springframework.http.MediaType.APPLICATION_JSON)
139152
.content("{}")
153+
.cookie(new Cookie("accessToken", "valid-access-token"))
140154
).andExpect(status().isOk());
141155
}
142156

143157
@Test
144158
@DisplayName("투표 단일 조회")
145-
@WithMockUser(username="1")
146159
void t10() throws Exception {
147160
PollDto responseDto = PollDto.builder().pollId(1L).voteTitle("테스트 투표").build();
148161
Mockito.when(pollService.getPoll(Mockito.anyLong())).thenReturn(responseDto);
149-
mockMvc.perform(get("/api/polls/1"))
162+
163+
mockMvc.perform(get("/api/polls/1")
164+
.cookie(new Cookie("accessToken", "valid-access-token")))
150165
.andExpect(status().isOk())
151166
.andExpect(org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath("$.result.pollId").value(1L))
152167
.andExpect(org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath("$.result.voteTitle").value("테스트 투표"));
153168
}
154169

155170
@Test
156171
@DisplayName("투표하기")
157-
@WithMockUser(username="1")
158172
void t11() throws Exception {
159173
PollVoteDto responseDto = PollVoteDto.builder().pollId(1L).memberId(1L).build();
160174
Mockito.when(pollService.vote(Mockito.anyLong(), Mockito.anyLong(), Mockito.anyLong())).thenReturn(responseDto);
175+
161176
mockMvc.perform(
162177
org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post("/api/polls/1/vote")
163178
.param("pollItemsId", "1")
179+
.cookie(new Cookie("accessToken", "valid-access-token"))
164180
).andExpect(status().isOk())
165181
.andExpect(org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath("$.result.pollId").value(1L))
166182
.andExpect(org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath("$.result.memberId").value(1L));
167183
}
168-
}
184+
}

0 commit comments

Comments
 (0)