Sobes.tech
Senior
56

Cum organizezi un TestContainer comun pentru mai multe clase de test fără oprire între ele?

Companiile au fost întrebate
СБЕРСБЕР

Răspuns de la AI

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