对于我的集成测试,我需要一个运行的MySQL数据库。我决定通过Testcontainers模块设置它。下面是我如何运行它。
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ActiveProfiles("integration-test")
public class IntegrationTest {
static MySQLContainer mysql = new MySQLContainer<>(DockerImageName.parse("mysql:8.0.33"));
static {
mysql.start();
}
@DynamicPropertySource
static void setProperties(DynamicPropertyRegistry dynamicPropertyRegistry) {
dynamicPropertyRegistry.add("spring.datasource.url", mysql::getJdbcUrl);
dynamicPropertyRegistry.add("spring.datasource.username", mysql::getUsername);
dynamicPropertyRegistry.add("spring.datasource.password", mysql::getPassword);
}
}
字符串
这是可行的,但我有几个集成测试类,使用相同的几行来启动容器感觉是一个糟糕的做法。我宁愿有一个类-比如integration-test
Spring profile -并在那里启动它一次。类似于这样:
@Configuration
@Profile("integration-test")
public class IntegrationTestProfile {
static MySQLContainer mysql = new MySQLContainer<>(DockerImageName.parse("mysql:8.0.33"));
static {
mysql.start();
}
@DynamicPropertySource
static void setProperties(DynamicPropertyRegistry dynamicPropertyRegistry) {
dynamicPropertyRegistry.add("spring.datasource.url", mysql::getJdbcUrl);
dynamicPropertyRegistry.add("spring.datasource.username", mysql::getUsername);
dynamicPropertyRegistry.add("spring.datasource.password", mysql::getPassword);
}
}
型
容器被启动了(我可以在日志中看到),但是属性没有被动态覆盖,而是使用了来自application.properties
的属性。
我该怎么弥补?
1条答案
按热度按时间cwdobuhd1#
您可以创建一个抽象
BaseIntegrationTest
,并从它扩展所有涉及Testcontainers的测试:容器和应用程序上下文都将启动一次,并在测试中共享:字符串