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

SpringBoot, test containers to test queries sent to external DB

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

有什么方法可以利用 spring 测试容器来测试这个功能吗? 我的目标是:

我看到很多例子,其中应用程序本身是针对测试容器进行测试的,但是我可以启动容器 w/o 将其作为应用程序持久性数据库插入吗?

can I just start container w/o plugging it as App persistence DB?

是的,这完全有可能。 Testcontainers 本身与 Spring 或 Spring Boot.

无关

你会做的是:

  • 选择您要使用的容器(不同数据库使用不同容器
  • 实例化容器
  • 启动它
  • 从中构造一个 DataSource
  • 使用那个 DataSource 进行测试。

Spring 数据 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;");
    }
}