весенний тестконтейнеров несколько источников данных - PullRequest
0 голосов
/ 13 февраля 2020

В настоящее время я работаю в проекте Spring Boot (2.2.4) с Spring Data JPA. В настоящее время мы настроили 2 источника данных, поскольку у нас есть 2 базы данных (на одном хосте), как описано здесь: https://springframework.guru/how-to-configure-multiple-data-sources-in-a-spring-boot-application/ или здесь: https://www.baeldung.com/spring-data-jpa-multiple-databases

Итак, мой файл 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 (https://www.testcontainers.org/) и JUnit 5 для проведения интеграционных тестов. Все отлично работает с одним источником данных, однако становится сложным при использовании двух источников данных.

Вот некоторый псевдокод для моего IntegrationTest:

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

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

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

}

Возможно, вы заметили, что я определил Junit5-Extension: «TestExtensions.class», который расширяется моим IntegrationTest. Это расширение содержит логи c для управления контейнерами:

   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 и задаем системные свойства (jdb-url, имя пользователя, пароль), чтобы наше приложение могло общаться с база данных. Эта настройка прекрасно работает для одного источника данных, однако я хочу, чтобы мои интеграционные тесты могли общаться с двумя разными источниками данных.

Я попытался добавить свойства для моего второго источника данных в мое расширение, как показано ниже, поэтому они доступны, и приложение использует это для подключения ко второй базе данных:

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());

Однако , это не работает, я всегда получаю сообщение об ошибке: Bad Credentials. Я не уверен, возможно ли иметь разные источники данных в одном и том же контейнере, поскольку вы можете определить одно имя базы данных / схему только при запуске db-контейнера:

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

Я не уверен, как решить эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...