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

qheogus55님의 프로필 이미지

작성한 질문수

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

테스트를 작성하는 마음가짐

안녕하세요 스프링 시큐리티 테스트에 대한 질문이 있습니다.

작성

·

108

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

박우빈님의 프로필 이미지
박우빈
지식공유자

안녕하세요, qheogus55 님!

인프런 AI 인턴이 잘 말해주었듯이, @WebMvcTest 는 Controller 계층을 대상으로 한 테스트 환경을 제공하기 때문에 시큐리티 설정을 포함하고 있지는 않습니다.

따라서 시큐리티 테스트를 위해서는 전체 컨텍스트를 기반으로 서버를 띄워서 테스트하는 SpringBootTest 방식을 사용하는 것이 편리합니다.

감사합니다 🙂

0

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

@WebMvcTest는 스프링 MVC 계층의 컨트롤러만을 대상으로 한 제한된 테스트 컨텍스트를 제공하며 기본적으로 시큐리티 설정을 포함하지 않습니다. 따라서 @WebMvcTest(AccountController.class)를 사용할 때 스프링 시큐리티의 예외 핸들링 로직을 제대로 테스트하기 어려울 수 있습니다. 이 경우, @MockBean을 사용해 UserDetailsService 등의 시큐리티 관련 빈을 명시적으로 모의화하여 테스트하거나, 별도의 시큐리티 설정 클래스를 테스트에 포함시켜야 할 수 있습니다.

반면, @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)를 사용하면 전체 애플리케이션 컨텍스트를 로드하기 때문에 스프링 시큐리티 설정까지 포함하여 더 포괄적인 통합 테스트가 가능합니다. 이 방식을 사용하면 시큐리티 예외 핸들링을 포함한 실제 애플리케이션의 동작을 보다 정확히 테스트할 수 있으므로, 시큐리티 예외 처리를 검증하고자 할 때 적절합니다.

  1. @WebMvcTest 방식으로도 스프링 시큐리티 예외 처리를 테스트할 수 있는 방법은 있으나, 시큐리티 설정을 명시적으로 테스트 컨텍스트에 포함시키거나 모의 객체를 사용하는 등 추가적인 작업이 필요할 수 있습니다.

  2. 전체 애플리케이션의 보안과 관련된 기능을 포함하여 테스트하고 싶다면 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)를 추천합니다. 단, 단위 테스트의 속도가 중요하거나 특정 컨트롤러의 기능만을 빠르게 테스트하고 싶은 경우에는 @WebMvcTest를 사용하는 것이 더 적합할 수 있습니다.