작성
·
43
0
안녕하세요 강사님
강의를 굉장히 잘 들었던 수강생입니다. 다름이 아니라 최근 spring security 를 도입하고 난 뒤에 rest docs 에 대해 문제가 생겨 질문하게 되었습니다.
'회원 정보 조회' 라는 API 가 있고, 이 API 는 로그인을 한 뒤에 securityContextholder 에 담겨져 있는 객체를 사용하고자 파라미터로 @AuthenticationPrincipal 이라는 어노테이션을 이용하여 받고 있습니다.
그러나...restdocs 를 이용하여 해당 API 를 문서화 시키려고 할때 객체가 null 이 들어가서 테스트가 실패를 하게 되더라구요.
docs 가 아닌 일반 controller test 에서는 @SpringBootTest 를 사용하여 @WithUserDetails 를 통해 테스트를 통과했습니다.
그러나 @SpringBootTest 를 따로 사용하고 있지 않은 상황에서 어떻게 해결할 수 있을지 고민입니다 ㅠㅠ
감사합니다.
답변 2
0
안녕하세요, 인프런 AI 인턴입니다.
Spring Security와 관련된 RestDocs 테스트에서 발생하는 문제에 대해서 고민이 많으신 것 같습니다. 기본적으로, @AuthenticationPrincipal
을 사용하는 경우 해당 파라미터에 올바른 사용자가 설정되어야 하기 때문에 문서화 테스트를 위한 별도의 설정이 필요합니다.
다행히도, Spring Security를 RestDocs와 함께 사용하면서 비슷한 문제를 해결하신 분들이 있습니다. 아래와 같은 방법으로 접근할 수 있습니다:
Spring Security 설정 추가: Security Context에 인증된 사용자가 필요하므로 MockMvc
를 설정할 때 Spring Security를 추가로 구성해야 합니다. 이를 위해 SecurityMockMvcConfigurers.springSecurity()
를 MockMvcBuilders
에 추가해 보세요.
@WithMockUser
어노테이션 사용: 테스트 메소드에 @WithMockUser
어노테이션을 사용하여 임시 사용자 인증을 설정해 볼 수 있습니다. 이는 @WithUserDetails
와 유사하게 작동하지만 RestDocs 테스트 환경에서 더 적합할 수 있습니다.
예제 코드를 참고로 하시면 도움이 될 수 있습니다:
import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
// 예제 테스트 메소드
@WithMockUser(username = "testUser", roles = "USER")
@Test
public void testUserInfoAPI() throws Exception {
mockMvc.perform(RestDocumentationRequestBuilders.get("/api/user/info")
.with(csrf()))
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(document("user-info"));
}
이 방법을 사용하면, Spring Security와 RestDocs 간의 호환 문제를 해결할 수 있습니다.
관련 게시물로는 Spring Security 적용 시 controller @WebMvcTest와 Spring Security 를 포함한 WebMvcTest 질문드립니다. 등을 참고하시면 도움이 되실 겁니다. 두 게시물 모두 Spring Security를 활용한 테스트에서 맞닥뜨릴 수 있는 문제점과 해결 방법에 대해 심층적으로 다루고 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
를 @SpringBootTest 를 추가해서
로 변경하여 테스트 통과를 하긴 했습니다...security 를 도입하면 standaloneSetup 은 사용할 수 없는지 다시 확인해보긴 해야겠네요 ㅎㅎ 감사해요 AI