안녕하세요 스프링 시큐리티 테스트에 대한 질문이 있습니다.
218
작성한 질문수 42
스프링 시큐리티를 사용하고 시큐리티 설정안에서 아래와 같은 예외 핸들링을 해주었을때
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)를 사용하면 전체 애플리케이션 컨텍스트를 로드하기 때문에 스프링 시큐리티 설정까지 포함하여 더 포괄적인 통합 테스트가 가능합니다. 이 방식을 사용하면 시큐리티 예외 핸들링을 포함한 실제 애플리케이션의 동작을 보다 정확히 테스트할 수 있으므로, 시큐리티 예외 처리를 검증하고자 할 때 적절합니다.
@WebMvcTest방식으로도 스프링 시큐리티 예외 처리를 테스트할 수 있는 방법은 있으나, 시큐리티 설정을 명시적으로 테스트 컨텍스트에 포함시키거나 모의 객체를 사용하는 등 추가적인 작업이 필요할 수 있습니다.전체 애플리케이션의 보안과 관련된 기능을 포함하여 테스트하고 싶다면
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)를 추천합니다. 단, 단위 테스트의 속도가 중요하거나 특정 컨트롤러의 기능만을 빠르게 테스트하고 싶은 경우에는@WebMvcTest를 사용하는 것이 더 적합할 수 있습니다.
private 상수 테스트 관련 질문
0
87
1
void는 어떻게 테스트하나요..? void로 애초에 코딩하면 안되나요??
0
128
2
커버리지는 어떻게 활용하시는지 궁금합니다.
0
163
2
테스트 문서화 질문입니다
0
107
2
단위테스트 질문이 있습니다
0
96
2
컨트롤러는 모킹을 한 이유가 궁금합니다.
0
106
2
ERD 가장자리에 있는 도메인 테스트 질문
0
90
2
DTO 검증 필드에 대한 테스트 코드 작성은 어디까지?
0
136
2
OrderCreateRequest DTO에 대해서 궁금한점
0
104
2
고전파의 테스트 대역 사용 대상, 공유 의존성
0
157
2
계층 관련 질문이 있습니다.
0
140
3
'코틀린'에서는 빌더를 따로 쓰지 않는데, 이 때는 어떻게 test fixture를 만드시는지 궁금합니다
1
124
2
혹시 update 로직은 어떻게 테스트하나요? (@Setter?)
0
135
2
단위테스트와 통합테스트의 경계가 궁금합니다.
0
235
2
Service+Repository 통합테스트 관련 질문입니다.
0
151
2
OrderControllerDocsTest 작성 해봤는데요. 날짜 형식이 이상하게 나와요
0
186
2
test 용 .yml
0
91
2
throws Exception
0
81
2
카페키오스크 클래스 문의 ,,
0
90
2
Rest docs 문서용 테스트코드를 따로 작성해야 되나요?
0
176
2
테스트 코드에서 필요한 생성자
0
139
1
tearDown 순서
0
116
2
@Builder 생성자 private
0
137
2
@DisplayName gradle / intellJ
0
94
2





