Как отключить отключение контейнеров в 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);
}
когда я запускаю только один экземпляр класса тестирования IT, он работает нормально.
Но когда я запускаю несколько тестовых классов, один первый будет завершен, а другой потерпит неудачу из-за закрытия 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 не останавливать контейнеры после выполнения одного класса, но когда все они закончили?
2 ответа
Решение
Я нашел это решение как обходной путь. Может быть, есть лучшая душа?
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
Теперь это возможно, установив экспериментальный.withReuse(true)
при настройке контейнера:
new GenericContainer<>(IMAGE).withExposedPorts(PORT).withReuse(true);
Не забудьте запустить контейнер с.start()
и добавлениеtestcontainers.reuse.enable=true
в ~/.testcontainers.properties