Какой у вас опыт написания интеграционных тестов?

«Какой у вас опыт написания интеграционных тестов?» — вопрос из категории Тестирование, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Интеграционные тесты проверяют взаимодействие между компонентами системы (БД, API, внешние сервисы). Основной стек: Spring Boot Test с аннотациями @SpringBootTest, @DataJpaTest, @WebMvcTest. Для изоляции зависимостей использую Mockito, для тестовых данных — H2 (in-memory) или Testcontainers (реальные контейнеризированные БД).

Почему это важно: Интеграционные тесты выявляют проблемы, которые unit-тесты не ловят (например, некорректные маппинги JPA, конфигурацию Spring, работу транзакций).

Пример интеграционного теста для REST API:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class UserControllerIntegrationTest {
    @Autowired
    private TestRestTemplate restTemplate;

    @Test
    void getUserById_ReturnsUserAndOkStatus() {
        ResponseEntity<UserDto> response = restTemplate
            .getForEntity("/api/users/1", UserDto.class);

        assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
        assertThat(response.getBody()).isNotNull();
        assertThat(response.getBody().getId()).isEqualTo(1L);
    }
}

Ключевые практики:

  1. Изоляция тестов: Использую @Transactional или @DirtiesContext для очистки состояния между тестами.
  2. Тестовая БД: Для тестов с JPA применяю @DataJpaTest с H2, для продакшен-подобного окружения — Testcontainers с PostgreSQL.
  3. Слои тестирования: Тестирую не только контроллеры, но и сервисы с репозиториями, чтобы локализовать проблему.