Sobes.tech
Senior
59

Comment organiser un TestContainer commun pour plusieurs classes de test sans arrêt entre elles?

Entreprises à qui on a demandé
СБЕРСБЕР

Réponse de l'IA

sobes.tech IA

Чтобы использовать один общий 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, чтобы контейнер жил на время всего контекста тестов.