Spring Boot,测试容器以测试发送到外部数据库的查询
Posted
技术标签:
【中文标题】Spring Boot,测试容器以测试发送到外部数据库的查询【英文标题】:SpringBoot, test containers to test queries sent to external DB 【发布时间】:2020-07-26 01:00:48 【问题描述】:我的 Spring 应用程序有自己的持久性数据库。 同一个应用程序需要向外部数据库发送临时查询。 查询由用户提供。
App 接受用户提供的 SQL 查询 应用程序采用外部数据库类型(postgres/oracle/whatever jdbc) 应用在运行时向外部数据库提交即席查询 应用将结果以 json 格式返回给用户有什么方法可以利用 spring 测试容器来测试这个功能? 我的目标是:
为每个受支持的数据库编写测试 每个测试都使用受支持的数据库启动测试容器(我想是其中的一些子集:https://www.testcontainers.org/modules/databases/) 每个测试都将样本数据上传到容器数据库 每个测试都会针对它运行一组“必须工作”的查询。我看到了很多应用程序本身针对测试容器进行测试的示例,但我可以直接启动容器而不将其作为应用程序持久性数据库插入吗?
【问题讨论】:
【参考方案1】:我可以直接启动容器而不将其作为应用持久性数据库插入吗?
是的,这是完全可能的。 测试容器本身与 Spring 或 Spring Boot 无关。
你会做的是:
选择你想使用的容器(不同的容器用于不同的数据库 实例化容器 启动它 从中构造一个DataSource
使用 DataSource
进行测试。
Spring Data JDBC 正是这样做来针对各种数据库运行测试。 最后添加the class doing that for 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;");
【讨论】:
以上是关于Spring Boot,测试容器以测试发送到外部数据库的查询的主要内容,如果未能解决你的问题,请参考以下文章
编辑并重新运行 Spring Boot 单元测试,无需重新加载上下文以加快测试速度
为啥 Spring Boot 使用单例容器方法生成 2 个测试容器?