인프런 커뮤니티 질문&답변

leeseongju님의 프로필 이미지
leeseongju

작성한 질문수

Practical Testing: 실용적인 테스트 가이드

Spring REST Docs

spring security @AuthenticationPrincipal rest docs 질문

작성

·

18

0

안녕하세요 강사님

강의를 굉장히 잘 들었던 수강생입니다. 다름이 아니라 최근 spring security 를 도입하고 난 뒤에 rest docs 에 대해 문제가 생겨 질문하게 되었습니다.

'회원 정보 조회' 라는 API 가 있고, 이 API 는 로그인을 한 뒤에 securityContextholder 에 담겨져 있는 객체를 사용하고자 파라미터로 @AuthenticationPrincipal 이라는 어노테이션을 이용하여 받고 있습니다.

그러나...restdocs 를 이용하여 해당 API 를 문서화 시키려고 할때 객체가 null 이 들어가서 테스트가 실패를 하게 되더라구요.

docs 가 아닌 일반 controller test 에서는 @SpringBootTest 를 사용하여 @WithUserDetails 를 통해 테스트를 통과했습니다.
그러나 @SpringBootTest 를 따로 사용하고 있지 않은 상황에서 어떻게 해결할 수 있을지 고민입니다 ㅠㅠ

감사합니다.

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

Spring Security와 관련된 RestDocs 테스트에서 발생하는 문제에 대해서 고민이 많으신 것 같습니다. 기본적으로, @AuthenticationPrincipal을 사용하는 경우 해당 파라미터에 올바른 사용자가 설정되어야 하기 때문에 문서화 테스트를 위한 별도의 설정이 필요합니다.

다행히도, Spring Security를 RestDocs와 함께 사용하면서 비슷한 문제를 해결하신 분들이 있습니다. 아래와 같은 방법으로 접근할 수 있습니다:

  1. Spring Security 설정 추가: Security Context에 인증된 사용자가 필요하므로 MockMvc를 설정할 때 Spring Security를 추가로 구성해야 합니다. 이를 위해 SecurityMockMvcConfigurers.springSecurity()MockMvcBuilders에 추가해 보세요.

  2. @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 @WebMvcTestSpring Security 를 포함한 WebMvcTest 질문드립니다. 등을 참고하시면 도움이 되실 겁니다. 두 게시물 모두 Spring Security를 활용한 테스트에서 맞닥뜨릴 수 있는 문제점과 해결 방법에 대해 심층적으로 다루고 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

leeseongju님의 프로필 이미지
leeseongju
질문자

this.mockMvc = MockMvcBuilders.standaloneSetup(initController())
        .apply(documentationConfiguration(provider))
        .addFilter(springSecurityFilterChain)
        .build();

를 @SpringBootTest 를 추가해서

this.mockMvc = MockMvcBuilders.webAppContextSetup(context)
        .apply(documentationConfiguration(provider))
        .build();

로 변경하여 테스트 통과를 하긴 했습니다...security 를 도입하면 standaloneSetup 은 사용할 수 없는지 다시 확인해보긴 해야겠네요 ㅎㅎ 감사해요 AI

leeseongju님의 프로필 이미지
leeseongju

작성한 질문수

질문하기