Совместное подключение к базе данных между тестовыми классами JUnit 5

#spring #spring-boot #junit #junit5 #spring-test

#spring #spring-загрузка #junit #junit5 #spring-test

Вопрос:

У меня есть 6 классов JUnit в разных тестовых пакетах. Я хочу использовать application.properties файл, который используется Spring framework для настройки подключения к базе данных.

Проблема в том, как создать соединение с базой данных при запуске первого теста JUnit и повторно использовать его для всех классов. В конце, чтобы правильно закрыть соединение.

Ответ №1:

Для этого вы можете использовать Testcontainers. Если вы хотите повторно использовать существующий контейнер базы данных (например, PostgreSQL или MySQL), обязательно используйте ручной подход к жизненному циклу контейнера и запустите контейнер один раз (например, внутри абстрактного тестового класса). Testcontainers вызывает эти одноэлементные контейнеры:

 abstract class AbstractContainerBaseTest {

    static final MySQLContainer MY_SQL_CONTAINER;

    static {
        MY_SQL_CONTAINER = new MySQLContainer();
        MY_SQL_CONTAINER.start();
    }
}

class FirstTest extends AbstractContainerBaseTest {

    @Test
    void someTestMethod() {
        String url = MY_SQL_CONTAINER.getJdbcUrl();

        // create a connection and run test as normal
    }
}
  

Как только ваша JVM завершит работу, ваш контейнер будет удален.

Другим подходом может быть функция повторного использования Testcontainers:

 static PostgreSQLContainer postgreSQLContainer = (PostgreSQLContainer) new PostgreSQLContainer()
  .withDatabaseName("test")
  .withUsername("duke")
  .withPassword("s3cret")
  .withReuse(true);
  

Если настройки вашей базы данных одинаковы для всех ваших тестов, и вы выбираете эту функцию, Testcontainers будут повторно использовать уже запущенный контейнер. Имейте в виду, что при таком подходе вы должны очистить контейнер для себя, поскольку они остаются в живых после завершения всех тестов.

Комментарии:

1. К сожалению, я использую сервер MSSQL для этой базы данных?

2. Это не проблема, в Testcontainers также есть модуль MSSQL .