Ответ
Выбор зависит от типа приложения (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 в помощь, чтобы всю эту распределённую хуйню покрыть. Главное — не запутайся, а то получится пиздец, а не тесты.