[SPRING] 테스트 메소드 내에서 Spring 애플리케이션 컨텍스트를 다시로드하거나 새로 고칩니다.
SPRING테스트 메소드 내에서 Spring 애플리케이션 컨텍스트를 다시로드하거나 새로 고칩니다.
ProfileContext를 사용하고 있기 때문에 컨테스트를 새로 고치기 전에 한 줄의 코드를 실행해야하므로 내 테스트 클래스의 단일 메서드 내에서 내 applicationContext에서 활성화 된 Spring 프로필을 변경해야합니다. 나는 다음을 시도했다.
@WebAppConfiguration
@ContextConfiguration(locations = {"/web/WEB-INF/spring.xml"})
@ActiveProfiles(resolver = BaseActiveProfilesResolverTest.class)
public class ControllerTest extends AbstractTestNGSpringContextTests {
@Test
public void test() throws Exception {
codeToSetActiveProfiles(...);
((ConfigurableApplicationContext)this.applicationContext).refresh();
... tests here ...
codeToSetActiveProfiles(... back to prior profiles ...);
... ideally refresh/reload the context for future tests
}
}
그러나 나는 얻는다 :
java.lang.IllegalStateException: GenericApplicationContext does not support multiple refresh attempts: just call 'refresh' once
DirtiesContext는 클래스 / 메소드 실행 이후에 실행되기 때문에 나에게 적합하지 않으며 어쨌든 refresh / reload를 실행하기 전에 한 줄의 코드를 실행해야합니다.
어떤 제안? 실행중인 리스너 / 후크를 살펴 보려고했지만이 동작을 수행하기 위해 자신을 삽입 할 확실한 위치를 보지 못했습니다.
해결법
-
==============================
1.의도적으로 ApplicationContext의 프로그램 적 새로 고침은 Spring TestContext Framework에서 명시 적으로 지원하지 않습니다. 또한 테스트 메소드가 컨텍스트를 새로 고치는 것은 아닙니다.
의도적으로 ApplicationContext의 프로그램 적 새로 고침은 Spring TestContext Framework에서 명시 적으로 지원하지 않습니다. 또한 테스트 메소드가 컨텍스트를 새로 고치는 것은 아닙니다.
따라서 새로 고침해야 할 필요성을 재평가하고 전용 테스트 클래스에 다른 활성 프로파일 세트가 필요한 테스트 메소드를 배치하는 것과 같은 대안을 고려할 것을 권장합니다.
요약하면 @ActiveProfiles는 테스트 용 활성 프로필의 선언적 구성 (값 및 프로필 특성을 통한)과 프로그래밍 방식 구성 (해결 자 특성을 통한)을 지원하지만 메서드 수준이 아닌 테스트 클래스 수준에서만 지원합니다. 또 다른 옵션은 ApplicationContextInitializer를 구현하고 @ContextConfiguration (initializers = ...)을 통해이를 구성하는 것입니다.
ApplicationContext를 새로 고치기 전에 ApplicationContext에 영향을주는 유일한 방법은 SmartContextLoader를 구현하거나 제공된 클래스 중 하나를 확장하고 @ContextConfiguration (loader = ...)을 통해 구성하는 것입니다. 예를 들어, AbstractGenericContextLoader.customizeContext ()는 "Bean 정의가 컨텍스트로로드 된 후 컨텍스트가 새로 고쳐지기 전에 로더에 의해 생성 된 GenericApplicationContext를 사용자 정의 할 수 있습니다."
친애하는,
Sam (Spring TestContext Framework 작성자)
-
==============================
2.모든 응용 프로그램 컨텍스트가 다중 새로 고침을 지원하는 것은 아닙니다. AbstractRefreshableApplicationContext에 대한 javadoc에 따르면이 클래스의 하위 클래스 또는 AbstractRefreshableWebApplicationContext는 둘 이상의 새로 고침을 허용하고 GenericApplicationContext는 둘 중 하나만을 받아들입니다.
모든 응용 프로그램 컨텍스트가 다중 새로 고침을 지원하는 것은 아닙니다. AbstractRefreshableApplicationContext에 대한 javadoc에 따르면이 클래스의 하위 클래스 또는 AbstractRefreshableWebApplicationContext는 둘 이상의 새로 고침을 허용하고 GenericApplicationContext는 둘 중 하나만을 받아들입니다.
새로 고침을 지원하려면 ApplicationContext에 다른 클래스를 사용해야한다.
편집하다 :
@ContextConfiguration 어노테이션을 사용할 때, 커스텀 ContextLoader 또는 SmartContextLoader 구현을 사용하여 Spring이 덜 어리석은 ApplicationContext를 사용하도록해야한다. 그러나 나는 그것에 깨끗하고 깔끔한 길을 찾지 못했습니다. 그래서 내 테스트 클래스에서 XmlWebApplicationContext가 필요할 때 @ContextConfiguration을 사용하지 않고 @Before 메서드 나 테스트 시작 부분에서 수동으로 내 컨텍스트를 만들고 새로 고칩니다.
나는 이것이 당신의 질문에 실제로 대답하지 않는다는 것을 인식하지만, 당신은 그것을 해결 방법으로 볼 수 있습니다.
from https://stackoverflow.com/questions/24720330/reload-or-refresh-a-spring-application-context-inside-a-test-method by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] autowire 필드를 사용할 수 없습니다 : private org.springframework.security.core.userdetails.UserDetailsService (0) | 2019.01.17 |
---|---|
[SPRING] 로그인하지 않고 스프링 웹 소켓 @SendToUser? (0) | 2019.01.17 |
[SPRING] 스프링에서 동적으로 빈 참조를 설정하는 방법은? (0) | 2019.01.17 |
[SPRING] Spring - application 두 번 초기화 되었습니까? (0) | 2019.01.17 |
[SPRING] Spring Security Java Config가 로그 아웃 URL을 생성하지 않습니다. (0) | 2019.01.17 |