В настоящее время я работаю в проекте 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");
Я не уверен, как решить эту проблему.