在测试阶段,运行 方法在 spring 上下文启动之前(运行 嵌入式服务在 spring 上下文初始化之前)

On a testing phase, run method before spring context starts (run embedded service before spring context initializes)

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

在测试阶段,我如何在 Spring 上下文开始初始化之前 运行 该方法? 当前,Spring 初始化并抱怨无法与嵌入式 elasticsearch 建立连接。

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

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());
        }

}

并将此初始化程序添加到您的测试中 class:

@ContextConfiguration(initializers = Initializer.class)

在 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);
    }

}