领先一步
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
的信息。
祝您集成测试愉快!