Какие фреймворки подходят для интеграционного тестирования в Java?

Ответ

Выбор зависит от типа приложения (Spring, микросервисы, работа с БД). Вот основные инструменты:

1. Spring Boot Test — стандарт для Spring-приложений.

  • @SpringBootTest — поднимает полный контекст приложения.
  • @WebMvcTest — для тестирования слоя контроллеров (без полного поднятия контекста).
  • @DataJpaTest — для тестирования JPA-репозиториев.

Пример теста REST-контроллера:

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

    @Test
    void getUser_ReturnsUser() {
        ResponseEntity<User> response = 
            restTemplate.getForEntity("/api/users/1", User.class);
        assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
        assertThat(response.getBody().getName()).isEqualTo("John");
    }
}

2. Testcontainers — золотой стандарт для тестов с реальными внешними сервисами (БД, брокеры сообщений).

@Testcontainers
class UserRepositoryIT {
    @Container
    static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:15");
    // Тесты используют реальную БД в Docker
}

3. REST Assured — DSL для тестирования REST API.

given()
    .contentType(ContentType.JSON)
.when()
    .get("/users/1")
.then()
    .statusCode(200)
    .body("name", equalTo("John"));

4. WireMock — для мокирования HTTP-сервисов. Вывод: Для монолита на Spring — Spring Boot Test + Testcontainers. Для микросервисов — REST Assured/Testcontainers/WireMock.

Ответ 18+ 🔞

Да ты посмотри, какие у нас инструменты для интеграционных тестов развелись — прям как в хозяйственном магазине, выбирай не хочу! Но выбор-то, блядь, зависит от того, что у тебя за приложение, а не от того, что у тебя в голове ветром гуляет.

1. Spring Boot Test — это наш, родной, для спринг-приложений. Стандарт, де-факто.

  • @SpringBootTest — поднимает весь контекст, как ёбнутый, целиком. Тяжеловато, но если надо всё и сразу — то он.
  • @WebMvcTest — а это для тех, кому только контроллеры потестить. Контекст лёгкий, не грузит всю хуйню.
  • @DataJpaTest — для репозиториев этих, JPA-шных. Базу тестовую поднимет, слой данных проверит.

Вот, смотри, как REST-контроллер потрошить:

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

    @Test
    void getUser_ReturnsUser() {
        ResponseEntity<User> response = 
            restTemplate.getForEntity("/api/users/1", User.class);
        assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
        assertThat(response.getBody().getName()).isEqualTo("John");
    }
}

2. Testcontainers — это, сука, золотой наш стандарт! Когда надо не мокать, а взять реальную базу в докере и в неё ебашить.

@Testcontainers
class UserRepositoryIT {
    @Container
    static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:15");
    // И пошло-поехало, тесты на реальной постгре!
}

3. REST Assured — такой себе DSL, чтобы API щупать, как будто ты его постманом. Удобно, читаемо.

given()
    .contentType(ContentType.JSON)
.when()
    .get("/users/1")
.then()
    .statusCode(200)
    .body("name", equalTo("John"));

4. WireMock — а это когда твой сервис куда-то там стучится, а ты ему говоришь: «Стоять, я тебе сам ответ сэмулирую!». Для моков HTTP-сервисов — то, что надо.

Итог, ёпта: Если у тебя монолит на Spring — бери Spring Boot Test и прикручивай к нему Testcontainers, чтобы не на моках играться. Если микросервисы — тогда REST Assured, Testcontainers и WireMock в помощь, чтобы всю эту распределённую хуйню покрыть. Главное — не запутайся, а то получится пиздец, а не тесты.