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