1. 개요
@ContextConfiguration은 통합 테스트 환경에서 ApplicationContext를 어떻게 로드하고 설정할지를 결정하는 데 사용되는 클레스 레벨의 애너테이션이다.
주로 테스트 환경에서 @SpringBootTest를 이용해 전체 빈을 로딩하는 대신 가벼운 컨텍스트 환경을 구성하기 위해 사용된다. 이 애너테이션을 사용하면 일부 클래스만을 빈으로 등록하여 단일 클래스에 대한 테스트 실행 속도를 향상시킬 수 있다.
추후 다른 포스팅에서 다룰 예정인데, 이렇게 @ContextConfiguration을 사용하여 임의의 컨텍스트를 지정하면 여러 개의 컨텍스트가 생성되어 Test Context Caching의 효율이 떨어질 수 있으므로 단일 테스트 클래스의 실행속도는 빨라진다 하더라도 전체 테스트의 실행속도는 급격하게 떨어질 수 있다.
@ContextConfiguration(classes = TestConfig1.class)
class Test1 {
// ...
}
@ContextConfiguration(classes = TestConfig1.class)
class Test2 {
// ...
}
@ContextConfiguration(classes = TestConfig2.class)
class Test3 {
// ...
}
- Test1과 Test2는 같은 컨텍스트를 사용하는 반면, Test3은 다른 컨텍스트를 사용한다
- 따라서 위 예제에서 애플리케이션 컨텍스트는 총 2개가 생성된다
2. 사용 예제
@ContextConfiguration을 통해서 아래와 같이 컨텍스트를 로딩하기 위한 자원의 위치(빈을 정의해둔 XML 설정파일이나 Groovy 스크립트)나 컴포넌트 클래스(@Component 애너테이션이 붙은 클래스)를 지정할 수 있다.
@ContextConfiguration("/test-config.xml")
class XmlApplicationContextTests {
// class body...
}
@ContextConfiguration(classes = TestConfig.class)
class ConfigClassApplicationContextTests {
// class body...
}
또는 다음과 같이 ContextInitializer를 지정할 수도 있다.
@ContextConfiguration(initializers = CustomContextInitializer.class)
class ContextInitializerTests {
// class body...
}
참고로 ContextInitializer는 이름대로 컨텍스트를 로드하는 클래스다. 요즘은 이런 형태보단 간단하게 @Configuration으로 설정하지 않을까 싶다.
public class MyApplicationContextInitializer implements
ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext ac) {
String os = System.getProperty("os.name");
String profile = (os.toLowerCase().startsWith("windows")) ? "windows" : "other";
ConfigurableEnvironment ce = ac.getEnvironment();
ce.addActiveProfile(profile);
}
}
3. 참고
https://www.logicbig.com/tutorials/spring-framework/spring-core/tests-context-initializer.html
'Spring > Spring' 카테고리의 다른 글
[Spring] 로컬 캐시의 영향 없이 테스트 환경 구축하기 (0) | 2023.07.18 |
---|---|
[Spring] 스프링의 테스트 컨텍스트 캐싱(Spring TestContext Caching)에 대해 알아보자 (0) | 2023.07.17 |
[Spring] feign + hystrix 사용 시 특정 예외 무시하도록 처리하기 (0) | 2023.05.15 |
[Spring] Reactive Feign에서 커스텀 Serializer/Deserializer 사용하기 (0) | 2023.03.21 |
[Spring] @Bean 애너테이션의 name 속성과 value 속성 (0) | 2023.03.07 |