代码之家  ›  专栏  ›  技术社区  ›  hotzst

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

  •  0
  • hotzst  · 技术社区  · 6 年前

    对于我的应用程序,我创建了自己类型的 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 在测试中?这个 上下文 必须创建,才能启动spring应用程序,以使其工作,但 SpringBootTest 当输入构造函数时,这种情况已经发生了。 现有注释或参数是否有其他可应用的注释或参数?这些性质的测试是否应该添加注释 春靴测试 还有手动创建的应用程序?

    0 回复  |  直到 6 年前
        1
  •  2
  •   hotzst    6 年前

    我发现解决这个问题的方法是放弃 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));
        }
    }