对于我的应用程序,我创建了自己的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
注释这些性质的测试,而是手动创建应用程序吗?
答案 0 :(得分:1)
我发现解决此问题的方法是完全放弃SpringBootTest
批注,并将上下文构造为构造函数的一部分。另外,您也可以在BeforeAll
或BeforeEach
方法中执行此操作,但是随着我的测试类扩展需要注入一些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));
}
}