본문 바로가기
개발/SpringBoot

(Java/Kotlin)[Spring Security] MockMvc 테스트 시, 특정 Filter 를 제외하기

by Mingvel 2023. 11. 30.

 

이번 글에서는 MockMvc 테스트 시, 특정 Filter를 사용하지 않도록 하는 방법에 대해서 다뤄보겠습니다

 

미리 말씀드리자면 이 방법은 편법에 가깝다고 생각합니다

 

더 나은 방법이 있다면 해당 방법을 사용하는 것을 권장합니다

 

먼저 Spring에서 Bean을 등록할 때 Bean 이름은 기본적으로 Bean의 타입 (또는 클래스)을 기반으로 생성됩니다.

 

Bean의 이름이 같은 경우에는 나중에 정의된 Bean이전에 정의된 Bean을 오버라이드하게 됩니다.

 

따라서 @TestConfiguration 어노테이션이 명시된 클래스 내에서 제외하고자 하는 Bean을 재정의하면

 

이 Bean은 이전에 정의된 Bean을 오버라이드합니다.

 

이를 Filter에 적용하면

 

Test 패키지 내에 MockMvc 테스트에서 제외하고자 하는 Filter를 동일하게 생성해주고

 

내부 동작은 단순 다음 FilterChain에 Servlet요청, 응답을 전달하는 구조로 생성합니다

// test 패키지

class ApiKeyFilter : OncePerRequestFilter() {
    override fun doFilterInternal(
        request: HttpServletRequest,
        response: HttpServletResponse,
        filterChain: FilterChain
    ) {
        filterChain.doFilter(request, response)
    }
}

 

그 이후 Test Package 내 @TestConfiguration으로 명시 한 클래스 내부에 해당 Fitler를 Bean으로 등록해 줍니다

@TestConfiguration
public class TestFilterConfig {
    @Bean
    public ApiKeyFilter apiKeyFilter() {
        return new ApiKeyFilter();
    }
}

 

코드를 위와 같이 작성하면

 

실제로 어떤 로직도 포함하지 않은 ApiKeyFilter가 기존의 ApiKeyFilter를 Test 환경에서만 override 하여

 

Spring Test Context에 등록되기에 특정 Filter를 제외한 것과 동일한 동작을 수행할 수 있습니다

 

이는 Filter에 국한되는 것이 아니라

 

Spring Context에서 관리되는 모든 Bean에도 동일하게 적용이 가능합니다

 

Github : kotlin 예시

Github : Java 예시

 

 

 

이전 글 보기

(Java/Kotlin)[Spring Security] - Custom Filter를 등록하는 방법 (feat.OncePerRequestFilter)

 

(Java/Kotlin)[Spring Security] - Custom Filter를 등록하는 방법 (feat.OncePerRequestFilter)

Spring을 사용하는 환경에서 Custom Filter를 만들어 사용하는 일반적인 목적은 두 가지가 있습니다 (1) Client로부터 요청이 들어올 때, 요청이 Controller에 유입되기 전 사전처리 혹은 후처리를 하고 싶

far-ming.tistory.com

(Java/Kotlin)[Spring Security] - Custom Filter를 제외하는 방법

 

(Java/Kotlin)[Spring Security] - Custom Filter를 제외하는 방법

이전 글에서는 Custom Filter를 사용하는 이유와, 등록하고 사용하는 방법에 대해서 알아보았습니다[이전글 보기] (Java/Kotlin)[Spring Security] - Custom Filter를 등록하는 방법 (feat.OncePerRequestFilter) Spring을

far-ming.tistory.com

 

 

반응형

댓글