取得领先
VMware 提供培训和认证,以加速您的进步。
了解更多最近,在 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
方法替换 @ContextConfiguration
和 ApplicationContextInitializer
的使用,该方法具有相同目的。 如果我们对上面显示的集成测试类进行这些更改,它现在看起来像这样
@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
的更多信息。
祝您集成测试愉快!