middle
Что такое Testcontainers и зачем они нужны?
Testcontainers – Java-библиотека для запуска Docker-контейнеров в тестах. Позволяет тестировать с реальными БД, брокерами сообщений, кэшами вместо in-memory заглушек.
Аналогия из жизни: вместо того чтобы репетировать речь перед зеркалом (H2 in-memory), вы выступаете перед небольшой реальной аудиторией (настоящая PostgreSQL в контейнере). Обратная связь гораздо ближе к реальности.
Пример
Полный пример с PostgreSQL
@SpringBootTest
@Testcontainers
class UserServiceIT {
@Container
static PostgreSQLContainer<?> postgres =
new PostgreSQLContainer<>("postgres:16-alpine")
.withDatabaseName("testdb")
.withUsername("test")
.withPassword("test");
@DynamicPropertySource
static void configureProperties(DynamicPropertyRegistry registry) {
registry.add("spring.datasource.url", postgres::getJdbcUrl);
registry.add("spring.datasource.username", postgres::getUsername);
registry.add("spring.datasource.password", postgres::getPassword);
}
@Autowired
private UserService userService;
@Test
void shouldSaveAndRetrieveUser() {
User user = userService.create("John", "john@mail.com");
assertThat(userService.findById(user.getId()))
.isPresent()
.hasValueSatisfying(u -> assertThat(u.getName()).isEqualTo("John"));
}
}
Доступные контейнеры
| Контейнер | Класс | Образ |
|---|---|---|
| PostgreSQL | PostgreSQLContainer |
postgres:16 |
| MongoDB | MongoDBContainer |
mongo:7 |
| Kafka | KafkaContainer |
confluentinc/cp-kafka:7.6.0 |
| Redis | GenericContainer |
redis:7 |
| LocalStack (AWS) | LocalStackContainer |
localstack/localstack:3 |
Ключевые принципы
- Testcontainers > H2 – тестируете на реальной БД; нет расхождений синтаксиса и поведения
@Container+@Testcontainers– автоматический lifecycle (start/stop)@DynamicPropertySource– внедрение динамических свойств (порт, URL) в Spring context- Контейнеры переиспользуются между тестами через
staticполя
Частые ошибки
- Docker не установлен – Testcontainers требует Docker; в CI нужен Docker-in-Docker или Testcontainers Cloud
- Не
staticконтейнер – безstaticконтейнер перезапускается для каждого теста (медленно) - Не указать версию образа –
new PostgreSQLContainer<>("postgres")приводит к непредсказуемой версии
Как используется в 2026
- Testcontainers – стандарт для интеграционных тестов в Java-экосистеме
- Spring Boot 3.1+ – нативная поддержка через
@ServiceConnection(без@DynamicPropertySource) - Testcontainers Desktop / Cloud – запуск без локального Docker
На собеседовании: интервьюер хочет услышать, почему Testcontainers лучше H2, и как настраивается интеграция со Spring Boot. Частая ошибка – не знать про
@DynamicPropertySourceи@ServiceConnection.