Java SpringTestContainers包含多个数据源

Java SpringTestContainers包含多个数据源,java,spring,testing,mariadb,Java,Spring,Testing,Mariadb,目前,我正在使用SpringDataJPA进行SpringBoot(2.2.4)项目。 目前,我们已经配置了2个数据源,因为我们有2个数据库(在同一台主机上),如下所述:或如下所示: 因此,我的application.yml文件如下所示: app: datasource: db-1: url: jdbc:mariadb://db:3306/db1 username: *** password: **

目前,我正在使用SpringDataJPA进行SpringBoot(2.2.4)项目。 目前,我们已经配置了2个数据源,因为我们有2个数据库(在同一台主机上),如下所述:或如下所示:

因此,我的application.yml文件如下所示:

     app:
      datasource:
        db-1:
          url: jdbc:mariadb://db:3306/db1
          username: ***
          password: ***
          ....

        db-2:
          url: jdbc:mariadb://db:3306/db2
          username: ***
          password: ***
          ....
我正在使用testcontainers()和junit5进行集成测试。使用单个数据源时一切都很好,但是使用两个数据源时会变得棘手

下面是我的IntegrationTest的一些伪代码:

@SpringBootTest
@ExtendWith(TestExtension.class)
class IntegrationTest{

 @Test
 public void test() {
  repositoryDatabase1.saveInDatabase1
 }

 @Test
 public void secondTest() {
  repositoryDatabase2.readFromDatabase2
 }

}
您可能已经注意到,我定义了一个Junit5扩展:“TestExtensions.class”,它由我的IntegrationTest扩展。此扩展包含管理容器的逻辑:

   public class TestExtension
            implements BeforeAllCallback, AfterAllCallback {

        @Override
        public void beforeAll(ExtensionContext context) {

            MariaDBContainer container = 
                 new MariaDBContainer("mariadb:10.4.0").withDatabaseName("db1");

            container.start();

            System.setProperty("app.datasource.db1.url", container.getJdbcUrl());
            System.setProperty("app.datasource.db1.username", container.getUsername());
            System.setProperty("app.datasource.db1.password", container.getPassword());

            context
                    .getStore(ExtensionContext.Namespace.GLOBAL)
                    .put(MariaDBContainer.class.getSimpleName() , container);
        }

        @Override
        public void afterAll(ExtensionContext context) {
            context
                    .getStore(ExtensionContext.Namespace.GLOBAL)
                    .get(MariaDBContainer.class.getSimpleName(), MariaDBContainer.class)
                    .stop();
        }
    }
因此,我们启动一个MariaDBContainer,并设置系统属性(jdburl、用户名、密码),以便应用程序可以与数据库通信。这种设置对于单个数据源很好,但是我希望我的集成测试能够与两个不同的数据源通信

我尝试在扩展中添加第二个数据源的属性,如下所示,以便它们可用,应用程序使用此属性连接到第二个数据库:

System.setProperty("app.datasource.db1.url", container.getJdbcUrl());
System.setProperty("app.datasource.db1.username", container.getUsername());
System.setProperty("app.datasource.db1.password", container.getPassword());

System.setProperty("app.datasource.db2.url", "jdbc:mariadb://db:3306/db2");
System.setProperty("app.datasource.db2.username", container.getUsername());
System.setProperty("app.datasource.db2.password", container.getPassword());
然而,这不起作用,我总是得到错误:错误的凭据。 我不确定是否可能在同一个容器中有不同的数据源,因为启动db容器时只能定义单个数据库名称/模式:

MariaDBContainer container = 
                     new MariaDBContainer("mariadb:10.4.0").withDatabaseName("db1");

我不知道如何解决这个问题。

一次登录如何,然后以这种方式参考表格:
db_1.tbl
db_2.tbl
@RickJames您能详细说明一下吗?我不太清楚你说的一台物理机器到底是什么意思?MariaDB的一个“实例”?但是在那个实例中创建了两个
数据库
?然后,到MariaDB的一个“连接”就可以从任一数据库的表中存储/获取数据。