Spring Framework 5.2.5 和 Spring Boot 2.2.6 中的 @DynamicPropertySource

工程 | Andy Wilkinson | 2020 年 3 月 27 日 | ...

最近,在 Spring IO 和 SpringOne Platform 上谈论测试 Spring Boot 应用程序时,我提到了 Testcontainers讨论了配置测试以使用容器内运行的服务所涉及的样板代码。我很高兴地说,随着最近发布的 Spring Framework 5.2.5,这些样板代码已不复存在。

在刚刚发布的更改之前,您的集成测试看起来类似于以下内容

@SpringBootTest
@Testcontainers
@ContextConfiguration(initializers = ExampleIntegrationTests.Initializer.class)
class ExampleIntegrationTests {

    @Container
    static Neo4jContainer<?> neo4j = new Neo4jContainer<>();

    static class Initializer implements
            ApplicationContextInitializer<ConfigurableApplicationContext> {

        @Override
        public void initialize(ConfigurableApplicationContext context) {
            TestPropertyValues.of("spring.data.neo4j.uri=" + neo4j.getBoltUrl())
                    .applyTo(context.getEnvironment());
        }

    }

}

这里我们使用 @ContextConfiguration 来指定 ApplicationContextInitializer。 初始化器使用 Neo4j 容器的 bolt URL 值配置 spring.data.neo4j.uri 属性。 这允许应用程序中与 Neo4j 相关的 bean 与 Testcontainers 管理的 Docker 容器中运行的 Neo4j 通信。

感谢 Spring Framework 5.2.5 中所做的更改,可以使用静态 @DynamicPropertySource 方法替换 @ContextConfigurationApplicationContextInitializer 的使用,该方法具有相同目的。 如果我们对上面显示的集成测试类进行这些更改,它现在看起来像这样

@SpringBootTest
@Testcontainers
class ExampleIntegrationTests {

    @Container
    static Neo4jContainer<?> neo4j = new Neo4jContainer<>();

    @DynamicPropertySource
    static void neo4jProperties(DynamicPropertyRegistry registry) {
        registry.add("spring.data.neo4j.uri", neo4j::getBoltUrl);
    }

}

我们将代码量减少了三分之一,并且意图也更加清晰。

虽然新功能的灵感来自于使 Testcontainers 更容易在 Spring Boot 集成测试中使用,但它应该在任何基于 Spring 的集成测试中都很有用,在这些测试中,属性的值并非预先知道。 您可以在 Spring Framework 参考文档中了解有关 @DynamicPropertySource 的更多信息。

祝您集成测试愉快!

获取 Spring 新闻资讯

通过 Spring 新闻资讯保持联系

订阅

取得领先

VMware 提供培训和认证,以加速您的进步。

了解更多

获取支持

Tanzu Spring 在一个简单的订阅中提供对 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部