Java 具有自定义应用程序上下文的Spring集成测试
对于我的应用程序,我创建了自己类型的Java 具有自定义应用程序上下文的Spring集成测试,java,spring,spring-boot,integration-testing,Java,Spring,Spring Boot,Integration Testing,对于我的应用程序,我创建了自己类型的ApplicationContext,允许我以应用程序所需的特定方式进行交互。由于应用程序是桌面应用程序,我创建如下上下文: @SpringBootApplication @Import(StandaloneConfiguration.class) @PropertySource(value = {"application.properties", "server.properties"}) public class OpenPatricianApplicat
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引导集成测试,它实际上依赖于我自己的ApplicationNext
实现的功能
@SpringBootTest(classes = {ServerTestConfiguration.class})
public class ServerIntegrationTest {
private DependentAnnotationConfigApplicationContext context;
}
如何在测试中初始化我的上下文
?必须创建上下文
,才能启动spring应用程序,但使用SpringBootTest
注释,当输入构造函数时,这种情况已经发生。
现有注释或参数是否有其他可应用的注释或参数?这些性质的测试是否应该不使用
SpringBootTest
进行注释,并且手动创建应用程序?我发现解决这个问题的方法是完全放弃SpringBootTest
注释,并将上下文构造为构造函数的一部分。或者,您也可以在BeforeAll
或beforeach
方法中执行此操作,但由于我的测试类扩展了需要注入一些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));
}
}
公共类ServerIntegrationTest扩展了SaveLoadBase{
public CityWallSerializationTest(){
SpringApplicationBuilder=新的SpringApplicationBuilder(ServerTestConfiguration.class);
DependentAnotationConfigApplicationContext上下文=(DependentAnotationConfigApplicationContext)builder.contextClass(DependentAnotationConfigApplicationContext.class).run();
setContext(context);
setClientServerEventBus((AsyncEventBus)context.getBean(“clientServerEventBus”);
setLoadAndSaveService(context.getBean(TestableLoadAndSaveService.class));
}
}
我发现解决这个问题的方法是完全放弃SpringBootTest
注释,并将上下文构造为构造函数的一部分。或者,您也可以在BeforeAll
或beforeach
方法中执行此操作,但由于我的测试类扩展了需要注入一些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));
}
}
公共类ServerIntegrationTest扩展了SaveLoadBase{
public CityWallSerializationTest(){
SpringApplicationBuilder=新的SpringApplicationBuilder(ServerTestConfiguration.class);
DependentAnotationConfigApplicationContext上下文=(DependentAnotationConfigApplicationContext)builder.contextClass(DependentAnotationConfigApplicationContext.class).run();
setContext(context);
setClientServerEventBus((AsyncEventBus)context.getBean(“clientServerEventBus”);
setLoadAndSaveService(context.getBean(TestableLoadAndSaveService.class));
}
}
此代码如何工作?不能使用具有不同类名的构造函数。我不明白你在干什么。使用Spring,在初始化过程中,您至少有3种方式与bean交互,您应该在main方法中实现这一点?不能使用具有不同类名的构造函数。我不明白你在干什么。使用Spring,您在初始化期间至少有3种方法与bean交互,您应该在main方法中这样做。