【发布时间】:2020-10-08 05:45:48
【问题描述】:
上下文:
我有一个非 Spring Boot 应用程序,我将其包装在 Spring Boot 中以测试功能。碰巧代码在测试中有一个内存数据库,我想针对不同的数据库进行测试以重现生产环境。我决定使用testcontainers 以保持所有现有测试不变。
问题:
我需要将数百万行加载到测试容器中。问题是如何在testcontainers 中填充数据库?我发现了一个类似的问题 -> How to populate testcontainers? 但我仍然无法在其中填充数据。
如何在testcontainers 中填充数据?
DatabaseTestInitalizer.java我用于实例化容器:
import org.springframework.boot.test.util.EnvironmentTestUtils;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.testcontainers.containers.MSSQLServerContainer;
public class DatabaseTestInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
private MSSQLServerContainer mssqlServerContainer;
@Override
public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
mssqlServerContainer = new MSSQLServerContainer();
mssqlServerContainer.start();
// This is solution for 1.x.x Spring Boot framework
// Article for migration from 1.x.x to 2.x.x Spring Boot https://stackoverflow.com/questions/54718995/appropriate-usage-of-testpropertyvalues-in-spring-boot-tests
EnvironmentTestUtils.addEnvironment(configurableApplicationContext.getEnvironment(),
"spring.datasource.url=" + mssqlServerContainer.getJdbcUrl(),
"spring.datasource.username=" + mssqlServerContainer.getUsername(),
"spring.datasource.password=" + mssqlServerContainer.getPassword()
);
}
}
【问题讨论】:
-
您应该在测试类的“之前”块中手动填充它。或者你可以使用
docker-entrypoint-initdb.d机制。在此处查看“初始化新实例”部分:hub.docker.com/_/mysql -
您是使用 Flyway 来填充您的数据库架构,还是使用已经包含您架构的 MySQL Docker 映像?
-
@rieckpil 不,我真的不需要它的原因。在生产中,我只是从数据库中读取。我正在尝试创建一个测试以在测试中重现生产条件。 Flyway、Liquibase 或其他工具对于项目来说将是多余的和不必要的复杂化。我想我找到了解决方案
.withInitScript,但它很慢。
标签: java spring-boot testcontainers