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方法中这样做。