복붙노트

[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. ==============================

    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. ==============================

    2.모든 응용 프로그램 컨텍스트가 다중 새로 고침을 지원하는 것은 아닙니다. AbstractRefreshableApplicationContext에 대한 javadoc에 따르면이 클래스의 하위 클래스 또는 AbstractRefreshableWebApplicationContext는 둘 이상의 새로 고침을 허용하고 GenericApplicationContext는 둘 중 하나만을 받아들입니다.

    모든 응용 프로그램 컨텍스트가 다중 새로 고침을 지원하는 것은 아닙니다. AbstractRefreshableApplicationContext에 대한 javadoc에 따르면이 클래스의 하위 클래스 또는 AbstractRefreshableWebApplicationContext는 둘 이상의 새로 고침을 허용하고 GenericApplicationContext는 둘 중 하나만을 받아들입니다.

    새로 고침을 지원하려면 ApplicationContext에 다른 클래스를 사용해야한다.

    편집하다 :

    @ContextConfiguration 어노테이션을 사용할 때, 커스텀 ContextLoader 또는 SmartContextLoader 구현을 사용하여 Spring이 덜 어리석은 ApplicationContext를 사용하도록해야한다. 그러나 나는 그것에 깨끗하고 깔끔한 길을 찾지 못했습니다. 그래서 내 테스트 클래스에서 XmlWebApplicationContext가 필요할 때 @ContextConfiguration을 사용하지 않고 @Before 메서드 나 테스트 시작 부분에서 수동으로 내 컨텍스트를 만들고 새로 고칩니다.

    나는 이것이 당신의 질문에 실제로 대답하지 않는다는 것을 인식하지만, 당신은 그것을 해결 방법으로 볼 수 있습니다.

  3. from https://stackoverflow.com/questions/24720330/reload-or-refresh-a-spring-application-context-inside-a-test-method by cc-by-sa and MIT license