Sobes.tech
Назад к вопросам
Senior
5

Как организовать общий TestContainer для нескольких тестовых классов без остановки между ними?

Компании, где спрашивали
СБЕРСБЕР

Ответ от нейросети

sobes.tech AI

Чтобы использовать один общий TestContainer для нескольких тестовых классов без его остановки между ними, можно применить паттерн Singleton или использовать аннотации JUnit 5 для управления жизненным циклом контейнера.

Например, создайте класс с контейнером как статическим полем и инициализируйте его один раз:

public class SharedContainer {
    public static final GenericContainer<?> container;

    static {
        container = new GenericContainer<>("postgres:13")
            .withExposedPorts(5432);
        container.start();
    }
}

В тестовых классах используйте этот контейнер, не останавливая его:

public class SomeTest {
    @BeforeAll
    static void setup() {
        // Используем SharedContainer.container
        String url = "jdbc:postgresql://" + SharedContainer.container.getHost() + ":" + SharedContainer.container.getFirstMappedPort() + "/test";
        // Инициализация подключения и т.д.
    }
}

Также можно использовать JUnit 5 Extension с аннотацией @TestInstance(Lifecycle.PER_CLASS) и управлять контейнером в методах с аннотациями @BeforeAll и @AfterAll, чтобы контейнер запускался один раз на весь набор тестов.

Если используется Spring Boot, можно создать bean с контейнером и указать scope singleton, чтобы контейнер жил на время всего контекста тестов.