Что такое WireMock и для чего он используется в тестировании?

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

Ответ

WireMock — это инструмент для мокирования (стабирования) HTTP-сервисов. Он запускает легковесный сервер, который имитирует поведение реального внешнего API (REST, SOAP), что необходимо для изоляции тестируемого сервиса от нестабильных или платных зависимостей.

Основные сценарии использования:

  1. Интеграционное тестирование: Проверка взаимодействия вашего приложения с внешним API.
  2. Тестирование негативных сценариев: Имитация таймаутов, ошибок 5xx, невалидных ответов.
  3. Разработка без зависимостей: Возможность писать и тестировать клиентский код, когда внешний сервис ещё не готов.

Пример настройки мока в 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 и использовать его в тестах.
  • Независимость от состояния: Моки изолированы и не зависят от данных во внешней системе.