Как отключить закрытие контейнеров в TestContainers?

У меня есть этот абстрактный класс для ИТ-тестов:

@RunWith(SpringRunner.class)
@Import(DbUnitConfig.class)
@SpringBootTest(classes = App.class, webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@DbUnitConfiguration(dataSetLoader = DbUnitDataSetLoader.class)
@TestExecutionListeners({
    DependencyInjectionTestExecutionListener.class,
    DirtiesContextTestExecutionListener.class,
    TransactionalTestExecutionListener.class,
    DbUnitTestExecutionListener.class
})
public abstract class AbstractIT {

    @ClassRule
    public static final DockerComposeContainer postgres =
        new DockerComposeContainer(new File("src/test/resources/docker-compose-postgres.yml"))
            .withExposedService("cars-user-postgres-it", 5432);

}

когда я запускаю только один экземпляр класса ИТ-тестирования, он работает нормально.

Но когда я запускаю несколько тестовых классов, один из них завершится первым, а другой потерпит неудачу из-за закрытия postgres.

это журнал из контейнера:

Stopping 1ykxuc_postgres-it_1 ... 

Stopping 1ykxucpostgres-it_1 ... done
Removing 1ykxuc_postgres-it_1 ... 

Removing 1ykxuc_cars-user-postgres-it_1 ... done
Removing network 1ykxuc_default

как сказать TestContainers не останавливать контейнеры после выполнения одного класса, а когда все они закончились?


person Igor    schedule 18.01.2018    source источник


Ответы (1)


я нашел это решение в качестве обходного пути. Может быть, есть лучшая душа?

   private static final DockerComposeContainer postgres = new DockerComposeContainer(new File("src/test/resources/docker-compose-postgres.yml"))
        .withExposedService("postgres-it", 5432);

    /**
     * static block used to workaround shutting down of container after each test class executed
     * TODO: try to remove this static block and use @ClassRule
     */
    static {
        postgres.starting(Description.EMPTY);
    }

yml-файл:

version: "2"
services:
cars-user-postgres-it:
    image: postgres
    ports:
        - 5432:5432
    environment:
        POSTGRES_USER: postgres
        POSTGRES_PASSWORD: postgres
        POSTGRES_DB: user
person Igor    schedule 18.01.2018
comment
Это рекомендуемое решение, когда вы хотите запустить одноэлементные контейнеры (т.е. 1 контейнер на выполнение JVM) :) - person bsideup; 19.01.2018
comment
@bsideup спасибо за ваше мнение! Теперь я знаю, что я на правильном пути - person Igor; 19.01.2018
comment
@bsideup — это метод запуска последней версии (1.9.1) (описание описания), помеченный как устаревший. Какое решение рекомендуется на данный момент? - person Tolledo; 18.10.2018
comment
Просто используйте postgres.start(); - person S.Spieker; 17.01.2019