24.08.26 07:18 작성
·
73
0
스프링 시큐리티를 사용하고 시큐리티 설정안에서 아래와 같은 예외 핸들링을 해주었을때
http.exceptionHandling(e -> e.authenticationEntryPoint((request, response, authException) -> {
CustomResponseUtil.fail(response, "로그인을 진행해 주세요", HttpStatus.UNAUTHORIZED);
}));
http.exceptionHandling(e -> e.accessDeniedHandler((request, response, accessDeniedException) -> {
CustomResponseUtil.fail(response, "권한이 없습니다", HttpStatus.FORBIDDEN);
}));
컨트롤러 테스트에서
@WebMvcTest(AccountController.class)
class AccountControllerTest {
테스트를 하면 예외 핸들링이 안되는거 같은데 맞을까요?
이러한 해결방법으로
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
이렇게 사용하면될거같은데
1. @WebMvcTest(AccountController.class)
방식으로도 해결할수 있는 방법이 있을까?
2. 어떤 방식을 더 추천하실까요?
답변 2
0
2024. 08. 30. 07:22
안녕하세요, qheogus55 님!
인프런 AI 인턴이 잘 말해주었듯이, @WebMvcTest
는 Controller 계층을 대상으로 한 테스트 환경을 제공하기 때문에 시큐리티 설정을 포함하고 있지는 않습니다.
따라서 시큐리티 테스트를 위해서는 전체 컨텍스트를 기반으로 서버를 띄워서 테스트하는 SpringBootTest 방식을 사용하는 것이 편리합니다.
감사합니다 🙂
0
안녕하세요, 인프런 AI 인턴입니다.
@WebMvcTest
는 스프링 MVC 계층의 컨트롤러만을 대상으로 한 제한된 테스트 컨텍스트를 제공하며 기본적으로 시큐리티 설정을 포함하지 않습니다. 따라서 @WebMvcTest(AccountController.class)
를 사용할 때 스프링 시큐리티의 예외 핸들링 로직을 제대로 테스트하기 어려울 수 있습니다. 이 경우, @MockBean
을 사용해 UserDetailsService
등의 시큐리티 관련 빈을 명시적으로 모의화하여 테스트하거나, 별도의 시큐리티 설정 클래스를 테스트에 포함시켜야 할 수 있습니다.
반면, @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
를 사용하면 전체 애플리케이션 컨텍스트를 로드하기 때문에 스프링 시큐리티 설정까지 포함하여 더 포괄적인 통합 테스트가 가능합니다. 이 방식을 사용하면 시큐리티 예외 핸들링을 포함한 실제 애플리케이션의 동작을 보다 정확히 테스트할 수 있으므로, 시큐리티 예외 처리를 검증하고자 할 때 적절합니다.
@WebMvcTest
방식으로도 스프링 시큐리티 예외 처리를 테스트할 수 있는 방법은 있으나, 시큐리티 설정을 명시적으로 테스트 컨텍스트에 포함시키거나 모의 객체를 사용하는 등 추가적인 작업이 필요할 수 있습니다.
전체 애플리케이션의 보안과 관련된 기능을 포함하여 테스트하고 싶다면 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
를 추천합니다. 단, 단위 테스트의 속도가 중요하거나 특정 컨트롤러의 기능만을 빠르게 테스트하고 싶은 경우에는 @WebMvcTest
를 사용하는 것이 더 적합할 수 있습니다.