개인 프로젝트 REST API Server 작업이 슬슬 마무리되는 단계여서 문서화의 필요성을 느꼈다.
API 문서화는 TestCode를 중요하게 생각하기때문에 RESTDocs로 결정.
Spring 공식 문서를 참조해가며 글 등록API를 문서화하려다 문제가 발생했다.
mockMvc를 이용해 문서화를 진행하려했고
컨트롤러 클래스의 테스트경우 SpringBoot Container를 띄우면 테스트가 장기적으로 느려질 가능성이 매우 크기에
standAloneSetup을 이용해 RestDocs Test를 진행하려했지만,
위 방법으로 mockMvc를 설정해 request를 요청하니 컨트롤러 메서드에서 받기로한
UserPrincipal 인증객체를 가져오지 못하는 에러가 발생했다.
RestDocs Test가 아닌 본 컨트롤러 단위테스트에서도 이런 경험이 있기에
@WithMockUser를 커스텀해 사용해 해결하고자 했지만
역시나 UserPrincipal이 모두 null로 넘어와 테스트가 진행이 안되는 상황...
해결
@WebMvcTest와 직접 mockMvc를 설정해 테스트의 차이에서 오는 문제점으로 파악,
둘의 차이를 찾아봤다.
@WebMvcTest:
- 컨트롤러뿐아니라 관련 필터, 시큐리티 config까지 띄워준다.
그에비해 직접 mockMvc를 설정할 경우 시큐리티 관련 클래스들은 설정되지않고,
직접 apply()를 통해 수많은 필터 혹은 클래스를 하나하나 추가해줘야한다.
@AutoConfigureRestDocs를 사용해 mockMvc를 내가 setting하지 않고 RestDocs Test를 진행하기로 결정했다.
해당 annotation은 uriScheme, uriHost, UriPort를 지정해주면 restDocs를 위한 request를 설정해준다.
그 후에 perform().with()에 UserDetails 담아 전송 할 수 있는 user() 메서드가 존재한다.
UserDetails를 구현한 User를 상속받은 CustomUserPrincipal을 담아 테스트를 진행.
성공적으로 문서화를 진행 할 수 있게됬다!
'Error' 카테고리의 다른 글
Test were not recieved (0) | 2024.01.09 |
---|---|
JWT Token AccessDenied 403 Error (0) | 2024.01.02 |
QueryDSL No Property Error (0) | 2023.12.12 |
테스트 환경에서 Cookie를 다루거나 검증해야할때 (0) | 2023.12.08 |
스프링 이미지 출력 문제 (0) | 2023.10.06 |