[SpringBootTest] @TestConfiguration 테스트 환경 구축하기

hyozkim·2021년 9월 28일
1

SpringBootTest

목록 보기
2/4
post-thumbnail
post-custom-banner

들어가면서 👋

실제 환경이 아닌 테스트 환경에서 코드를 작성하다보면 테스트를 위한 Configuration을 재정의할 필요가 생기는 것을 발견할 수 있다. 그 이유는 테스트 환경은 말 그대로 실제 외부 채널(3rd-Party)과 연결이 되면 안되거나 내부적인 로직에서 Security Interceptor 과정에서 패스시켜야 하는 테스트 환경이기 때문이다.

외부 채널

  • AWS S3
  • PG/VAN
  • Third party
  • etc..

@TestConfiguration

Path

main/java/... 경로 > @Configuration
test/java/... 경로 > @TestConfiguration

Import

TestConfiguration은 ComponentScan 과정에서 생성될 것이며 해당 자신이 속한 테스트가 실행될때 정의된 빈을 생성하여 등록한다.

@TestConfiguration
public class TestConfig implements WebMvcConfigurer {
    @Bean
    public SomeInterceptorTest someInterceptorTest() {
        return new SomeInterceptorTest();
    }

    @Bean
    public AnotherInterceptorTest anotherInterceptorTest() {
        return new AnotherInterceptorTest();
    }

    /**
     * Test 환경에서 재정의
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    	registry.addInterceptor(someInterceptorTest())
                .addPathPatterns("/**");

        registry.addInterceptor(anotherInterceptorTest())
                .addPathPatterns("/**");
    }
    
    ... 

ComponentScan을 통해서 감지되기 때문에 만일 @SpringBootTest의 classes 속성을 이용하여 특정 클래스만을 지정했을 경우에는 TestConfiguation은 감지되지 않는다고 한다. 그런 경우 classes 속성에 직접 TestConfiguration을 추가한다.

더 확실한 방법은 @Import 어노테이션을 사용하여 TestConfiguration을 명시하는 것이다.

@Import({TestConfig.class})
public abstract class SprintBootTestExample {
    protected final Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    protected MockMvc mockMvc;

    // ## Interceptor for Test
    @Autowired
    private SomthingInterceptorTest somethingInterceptorTest;
    @Autowired
    private AnotherInterceptorTest anotherInterceptorTest;
    
    @BeforeEach()
    void setUp(RestDocumentationContextProvider restDocumentationContextProvider) throws Exception {
        mockMvc = MockMvcBuilders
                .standaloneSetup() // Controllers Setup
                .addFilters(new CharacterEncodingFilter("UTF-8", true)) // UTF-8 Encoding
                .addInterceptors(somethingInterceptorTest, anotherInterceptorTest) 
                .build();
    }
}

참고

Toast Meetup Blog

profile
차근차근 develog
post-custom-banner

0개의 댓글