잡동사니

반응형

질문

내 응용 프로그램의 경우 5 월 응용 프로그램에 필요한 특정 방식으로 상호 작용할 수있는 고유 한 유형의 ApplicationContext 를 만들었습니다. 응용 프로그램이 데스크톱 응용 프로그램이므로 다음과 같은 컨텍스트를 만듭니다.

@SpringBootApplication
@Import(StandaloneConfiguration.class)
@PropertySource(value = {"application.properties", "server.properties"})
public class OpenPatricianApplication extends Application {
    private ApplicationContext context;
    @Override
    public void init() {
        SpringApplicationBuilder builder = new SpringApplicationBuilder(OpenPatricianApplication.class);
        context = builder.contextClass(DependentAnnotationConfigApplicationContext.class).run(getParameters().getRaw().toArray(new String[0]));
        // more initialisation

        }
    }
}

이제 내 자신의 ApplicationConext구현의 기능에 실제로 의존하는 Spring Boot 통합 테스트를 만들고 싶습니다.

@SpringBootTest(classes = {ServerTestConfiguration.class})
public class ServerIntegrationTest {
    private DependentAnnotationConfigApplicationContext context;
}

테스트에서 컨텍스트 를 초기화하려면 어떻게해야합니까? 스프링 애플리케이션을 시작하려면 context 를 만들어야하지만 SpringBootTest주석을 사용하면 생성자가 입력 될 때 이미 발생했습니다.적용 할 수있는 기존 주석에 대한 추가 주석 또는 매개 변수가 있습니까? 이러한 특성의 테스트에는 SpringBootTest 로 주석을 달지 않아야하며 애플리케이션은 수동으로 생성해야합니까?


답변1

이 문제를 해결하기 위해 찾은 접근 방식은 SpringBootTest주석을 모두 버리고 생성자의 일부로 컨텍스트를 구성하는 것입니다. 또는 BeforeAll또는 BeforeEach메소드에서 수행 할 수도 있지만, 내 테스트 class가 빈을 주입해야하는 기본 class를 확장하므로 생성자가 올바른 선택으로 보였습니다.

그러나 작동하지 않는 것은 생성자 주입을 통해 슈퍼 class에 빈을 주입하는 것입니다. 슈퍼 생성자에 대한 호출은 생성자에서 첫 번째 호출이어야하고 컨텍스트 및 I에 대한 정적 초기화 블록이 있어야하기 때문입니다. 특히 테스트가 끝날 때 컨텍스트가 제대로 정리되지 않은 경우 가능한 한 정적 인 것을 피하고 싶을 때, 메모리에로드 된 class의 일부로 유지되고 잠재적으로 많은 메모리를 소비하게됩니다.

그래서 여기에 코드가 있습니다 :

public class ServerIntegrationTest extends SaveLoadBase<CityWall> {

    public CityWallSerializationTest() {
        SpringApplicationBuilder builder = new SpringApplicationBuilder(ServerTestConfiguration.class);
        DependentAnnotationConfigApplicationContext context = (DependentAnnotationConfigApplicationContext) builder.contextClass(DependentAnnotationConfigApplicationContext.class).run();
        setContext(context);
        setClientServerEventBus((AsyncEventBus) context.getBean("clientServerEventBus"));
        setLoadAndSaveService(context.getBean(TestableLoadAndSaveService.class));
    }
}


 

 

 

 

출처 : https://stackoverflow.com/questions/59123714/spring-integration-test-with-custom-application-context

반응형

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band