我可以启动容器而不将其作为应用持久性数据库插入吗?
是的,这是完全可能的。Testcontainers 本身与 Spring 或 Spring Boot 无关。
你会做的是:
- 选择您要使用的容器(不同数据库的不同容器
- 实例化容器
- 启动它
DataSource
从中构造一个
- 将其
DataSource
用于您的测试。
Spring Data JDBC 正是这样做来针对各种数据库运行测试。最后,我添加了为 MySQL 执行此操作的类。这是一个 Spring 应用程序上下文配置,但您可以将其放在 JUnit before 方法、JUnit 4 规则或 JUnit 5 扩展中,或者只是您在测试开始时调用的普通方法。
@Configuration
@Profile("mysql")
class MySqlDataSourceConfiguration extends DataSourceConfiguration {
private static final MySQLContainer MYSQL_CONTAINER = new MySQLContainer().withConfigurationOverride("");
static {
MYSQL_CONTAINER.start();
}
/*
* (non-Javadoc)
* @see org.springframework.data.jdbc.testing.DataSourceConfiguration#createDataSource()
*/
@Override
protected DataSource createDataSource() {
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setUrl(MYSQL_CONTAINER.getJdbcUrl());
dataSource.setUser(MYSQL_CONTAINER.getUsername());
dataSource.setPassword(MYSQL_CONTAINER.getPassword());
dataSource.setDatabaseName(MYSQL_CONTAINER.getDatabaseName());
return dataSource;
}
@PostConstruct
public void initDatabase() throws SQLException, ScriptException {
ScriptUtils.executeSqlScript(createDataSource().getConnection(), null, "DROP DATABASE test;CREATE DATABASE test;");
}
}