0

我的 Spring 应用程序有自己的持久性数据库。同一个应用程序需要向外部数据库发送临时查询。查询由用户提供。

  • 应用接受用户提供的 SQL 查询
  • 应用程序采用外部数据库类型(postgres / oracle / 任何 jdbc)
  • 应用程序在运行时向外部数据库提交即席查询
  • 应用程序将结果作为 json 返回给用户

有没有办法利用弹簧测试容器来测试这个功能?我的目标是:

  • 为每个受支持的数据库编写测试
  • 每个测试都使用受支持的数据库启动测试容器(我想是其中的一些子集:https ://www.testcontainers.org/modules/databases/ )
  • 每个测试都将样本数据上传到容器数据库
  • 每个测试都会针对它运行一组“必须工作”的查询。

我看到了许多应用程序本身针对测试容器进行测试的示例,但是我可以在不将其作为应用程序持久性数据库插入的情况下启动容器吗?

4

1 回答 1

2

我可以启动容器而不将其作为应用持久性数据库插入吗?

是的,这是完全可能的。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;");
    }
}
于 2020-04-14T07:07:27.700 回答