Ответ
WireMock — это инструмент для мокирования (стабирования) HTTP-сервисов. Он запускает легковесный сервер, который имитирует поведение реального внешнего API (REST, SOAP), что необходимо для изоляции тестируемого сервиса от нестабильных или платных зависимостей.
Основные сценарии использования:
- Интеграционное тестирование: Проверка взаимодействия вашего приложения с внешним API.
- Тестирование негативных сценариев: Имитация таймаутов, ошибок 5xx, невалидных ответов.
- Разработка без зависимостей: Возможность писать и тестировать клиентский код, когда внешний сервис ещё не готов.
Пример настройки мока в JUnit-тесте:
@SpringBootTest
@AutoConfigureWireMock(port = 8089)
public class PaymentServiceTest {
@Test
public void whenExternalApiReturnsSuccess_thenPaymentIsProcessed() {
// 1. Стабируем (мокаем) ответ внешнего API
stubFor(post(urlEqualTo("/api/v1/charge"))
.willReturn(aResponse()
.withStatus(200)
.withHeader("Content-Type", "application/json")
.withBody("{ "transactionId": "12345" }")));
// 2. Вызываем наш сервис, который обратится к WireMock
PaymentResult result = paymentService.process("order_1");
// 3. Проверяем, что наш сервис корректно обработал ответ
assertThat(result.isSuccess()).isTrue();
assertThat(result.getTransactionId()).isEqualTo("12345");
// 4. (Опционально) Верифицируем, что запрос был отправлен с правильными данными
verify(postRequestedFor(urlEqualTo("/api/v1/charge"))
.withRequestBody(containing("order_1")));
}
}
Преимущества:
- Гибкость: Полный контроль над заголовками, телом, статусом и задержкой ответа.
- Запись и воспроизведение: Можно записать трафик к реальному API и использовать его в тестах.
- Независимость от состояния: Моки изолированы и не зависят от данных во внешней системе.