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社区中所有即将举行的活动。

查看全部