728x90
문제
OAuth2를 사용하는 SNS로그인을 구현하고 난 다음, 갑자기 대부분의 테스트 코드에서 에러가 발생하기 시작했다.
@Test
@DisplayName("추천글 작성")
void success_post_recommend() throws Exception {
RecommendPostRequest request = new RecommendPostRequest("제목", "내용", "유튜브", 100L, 1L);
RecommendPostResponse response = new RecommendPostResponse(1L, "제목", 100L);
given(recommendService.uploadPost(any(), any(), any())).willReturn(response);
MockMultipartFile file = new MockMultipartFile("file", "test.jpg", "image/jpeg",
"test data".getBytes());
String url = "/api/v1/recommends";
MockMultipartFile jsonPart = new MockMultipartFile("request", "request.json",
"application/json", objectMapper.writeValueAsBytes(request));
mockMvc.perform(multipart(url)
.file(file)
.file(jsonPart)
.with(csrf())
.with(httpBasic("username", "password"))
.header(HttpHeaders.AUTHORIZATION, "Bearer " + "token"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.resultCode").exists())
.andExpect(jsonPath("$.resultCode").value("SUCCESS"))
.andExpect(jsonPath("$.result.recommendNo").exists())
.andExpect(jsonPath("$.result.recommendNo").value(1))
.andExpect(jsonPath("$.result.recommendTitle").exists())
.andExpect(jsonPath("$.result.recommendTitle").value("제목"))
.andExpect(jsonPath("$.result.recommendPoint").exists())
.andExpect(jsonPath("$.result.recommendPoint").value(100L))
.andDo(print());
}
.header(HttpHeaders.AUTHORIZATION, "Bearer " + "token") 부분에서java.lang.NullPointerException: Cannot invoke "org.springframework.security.core.userdetails.UserDetails.getAuthorities()" because "userDetails" is null
다음 에러가 발생하고 있었다.
@WithMockUser를 사용하고 있음에도 OncePerRequestFilter를 상속받고 있는 JWTFilter를 거치며 UsernamePasswordAuthenticationToken 객체를 생성할 때 사용되는 userDetails.getAuthorities() 해당 부분이 null이라고 하는 것이다.
성공하는 법
- header 삭제
.header 부분의 한 줄을 제거시키면 또 문제없이 테스트코드는 통과되고 있었다.
하지만 이 방법은 문제를 피하는 방법이지 해결하는 방법이 아니었다. - "Bearer "문제
해당 부분이 문제였다. 정확히는 " " 띄어쓰기가 문제였다.
문제를 해결하기 위해 여러 인증 방법을 도입하고 있던 도중 토큰을 생성하였는데 "Bearer "가 필요한가?
라는 생각이 들었고, "Bearer "을 삭제하는 동시에 테스트 코드가 통과하기 시작했다.
혹시나 하는 마음에 AUTHORIZATION부분에 띄어쓰기를 없애고 "Bearer"만 입력했는데 코드가 통과했다.
후기
잘만 통과하던 코드가... OAuth2 설치 후에 갑자기 userDetails가 null이라며 에러가 나더니.
결론이 띄어쓰기라니! 이걸로 하루를 보내다니!
@Test
@DisplayName("추천글 작성")
void success_post_recommend() throws Exception {
RecommendPostRequest request = new RecommendPostRequest("제목", "내용", "유튜브", 100L, 1L);
RecommendPostResponse response = new RecommendPostResponse(1L, "제목", 100L);
given(recommendService.uploadPost(any(), any(), any())).willReturn(response);
MockMultipartFile file = new MockMultipartFile("file", "test.jpg", "image/jpeg",
"test data".getBytes());
String url = "/api/v1/recommends";
MockMultipartFile jsonPart = new MockMultipartFile("request", "request.json",
"application/json", objectMapper.writeValueAsBytes(request));
mockMvc.perform(multipart(url)
.file(file)
.file(jsonPart)
.with(csrf())
.with(httpBasic("username", "password"))
.header(HttpHeaders.AUTHORIZATION, jwtToken))
.andExpect(status().isOk())
.andExpect(jsonPath("$.resultCode").exists())
.andExpect(jsonPath("$.resultCode").value("SUCCESS"))
.andExpect(jsonPath("$.result.recommendNo").exists())
.andExpect(jsonPath("$.result.recommendNo").value(1))
.andExpect(jsonPath("$.result.recommendTitle").exists())
.andExpect(jsonPath("$.result.recommendTitle").value("제목"))
.andExpect(jsonPath("$.result.recommendPoint").exists())
.andExpect(jsonPath("$.result.recommendPoint").value(100L))
.andDo(print());
}
반응형