【问题标题】:On a testing phase, run method before spring context starts (run embedded service before spring context initializes)在测试阶段,在 spring 上下文启动之前运行方法(在 spring 上下文初始化之前运行嵌入式服务)
【发布时间】:2020-08-22 21:37:09
【问题描述】:

我有一个 spring boot 应用程序(spring boot 2.2.6),我正在尝试准备一个集成测试环境(嵌入在应用程序中); 我有一个初始化嵌入式弹性搜索服务的方法;

在测试阶段,如何在 Spring Context 开始初始化之前运行该方法? 目前,Spring 初始化并抱怨它无法建立与嵌入式 elasticsearch 的连接。

【问题讨论】:

    标签: spring-boot junit integration-testing


    【解决方案1】:

    您可以创建自定义初始化程序:

    static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
    
            @Override
            public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
    
                // initialize...
    
                TestPropertyValues
                        //here you can add properties to connect...
                        .of("some.property.key=some.property.value")
                        .applyTo(configurableApplicationContext.getEnvironment());
            }
    
    }
    

    并将这个初始化器添加到您的测试类中:

    @ContextConfiguration(initializers = Initializer.class)
    

    【讨论】:

      【解决方案2】:

      在 Spring Boot 2.2.6 和 Spring Framework 5.2.5 中可用,还有一个添加动态属性的附加选项

          @DynamicPropertySource
          static void dynamicProperties(DynamicPropertyRegistry registry) {
              registry.add("spring.application.name", () -> "name");
          }
      

      这可用于设置任何类型的动态属性,并且是 Initalizer 模式的替代品。

      更大的例子可以在 Spring 博客上看到,

      https://spring.io/blog/2020/03/27/dynamicpropertysource-in-spring-framework-5-2-5-and-spring-boot-2-2-6

      该示例结合 Testcontainers 为在 docker 容器中运行的 Neo4J 设置动态数据库 URL,

      @SpringBootTest
      @Testcontainers
      class ExampleIntegrationTests {
      
          @Container
          static Neo4jContainer<?> neo4j = new Neo4jContainer<>();
      
          @DynamicPropertySource
          static void neo4jProperties(DynamicPropertyRegistry registry) {
              registry.add("spring.data.neo4j.uri", neo4j::getBoltUrl);
          }
      
      }
      

      【讨论】:

      • 这是一个很好的解决方案,但是它需要 docker 用于测试容器 - 我一直在寻找一个没有外部要求的解决方案:) 无论如何,非常感谢,现在我知道存在 TestContainers
      • 请注意,动态属性源也可以提供任何东西,这只是比初始化器更清洁的方式 - testcontainers 只是一个主要用例
      猜你喜欢
      • 2012-07-21
      • 2019-02-18
      • 1970-01-01
      • 2016-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-07
      相关资源
      最近更新 更多