SpringBoot,测试容器以测试发送到外部数据库的查询

时间:2020-04-13 12:57:57

标签: spring-boot testing spring-data-jpa testcontainers multi-database

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

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

是否可以利用弹簧测试容器来测试此功能? 我的目标是:

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

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

1 个答案:

答案 0 :(得分:2)

我可以只启动容器而不将其作为App Persistence DB插入吗?

是的,这完全有可能。 测试容器本身与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;");
    }
}