具有自定义应用程序上下文的Spring集成测试

时间:2019-12-01 08:09:08

标签: java spring spring-boot integration-testing

对于我的应用程序,我创建了自己的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

        }
    }
}

现在,我想创建一个Spring Boot集成测试,该测试实际上依赖于我自己的ApplicationConext实现的功能。

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

如何在测试中初始化context?必须创建context才能启动spring应用程序,但要使用SpringBootTest注释,当输入构造函数时,这种情况已经发生。 现有的注释或参数是否可以应用?应该完全不用SpringBootTest注释这些性质的测试,而是手动创建应用程序吗?

1 个答案:

答案 0 :(得分:1)

我发现解决此问题的方法是完全放弃SpringBootTest批注,并将上下文构造为构造函数的一部分。另外,您也可以在BeforeAllBeforeEach方法中执行此操作,但是随着我的测试类扩展需要注入一些Bean的基类,构造函数似乎是正确的选择。

但是,不可行的是通过构造函数注入的方式在超类中注入Bean,因为对超级构造函数的调用必须是构造函数中的第一个调用,这将需要为它提供一个静态初始化程序块。上下文,我想尽可能避免使用静态内容,尤其是如果在测试结束时未正确清理上下文,则它将作为内存中已加载类的一部分继续存在,并可能消耗大量内存。 >

下面是代码:

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));
    }
}