Что такое WireMock и для чего его используют?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
# WireMock: Mock-сервер для тестирования API
Определение
WireMock — это мощный инструмент для создания mock HTTP сервера, который имитирует поведение реальных веб-сервисов. Он позволяет контролировать HTTP запросы и ответы без зависимости от реальных API.
Основные возможности
1. Создание stub-ов (заглушек) для HTTP endpoints
// Запуск WireMock сервера на порту 8080
@Rule
public WireMockRule wireMockRule = new WireMockRule(8080);
@Test
public void testGetUser() {
// Настройка мока: если GET /users/1, вернуть JSON
stubFor(get(urlEqualTo("/users/1"))
.willReturn(aResponse()
.withStatus(200)
.withHeader("Content-Type", "application/json")
.withBody("{\"id\":1,\"name\":\"John\"}")))
);
// Теперь реальный код может обращаться к http://localhost:8080/users/1
// и получит нужный ответ
}
2. Матчинг запросов по различным критериям
// По URL
stubFor(get(urlEqualTo("/api/users")).willReturn(...));
stubFor(get(urlMatching("/api/users/.*")).willReturn(...));
// По заголовкам
stubFor(post(urlEqualTo("/api/login"))
.withHeader("Authorization", containing("Bearer "))
.willReturn(...));
// По телу запроса
stubFor(post(urlEqualTo("/api/users"))
.withRequestBody(matchingJsonPath("$.email", matching(".*@example.com")))
.willReturn(...));
// По query параметрам
stubFor(get(urlEqualTo("/search?q=java"))
.willReturn(...));
Кейсы использования
1. Тестирование при недоступности внешних API
@Test
public void testPaymentProcessing() {
// Платёжный API может быть недоступен в боевых условиях
// В тестах используем WireMock вместо реального сервиса
stubFor(post(urlEqualTo("/api/payments"))
.willReturn(aResponse()
.withStatus(200)
.withBody("{\"transactionId\":\"123\"}")))
);
// Тест работает независимо от доступности платёжной системы
}
2. Тестирование обработки ошибок
@Test
public void testHandleApiTimeout() {
// Имитируем задержку
stubFor(get(urlEqualTo("/slow-api"))
.willReturn(aResponse()
.withFixedDelay(5000)) // 5 секунд задержки
);
// Имитируем ошибку
stubFor(get(urlEqualTo("/api/users/999"))
.willReturn(aResponse()
.withStatus(404)
.withBody("{\"error\":\"User not found\"}"))
);
}
3. Тестирование различных сценариев
@Test
public void testMultipleScenarios() {
// Успешный ответ
stubFor(get(urlEqualTo("/api/users"))
.willReturn(aResponse().withStatus(200).withBody("[...]")));
// Первый запрос — 503, второй — 200 (retry логика)
stubFor(get(urlEqualTo("/api/data"))
.inScenario("Retry scenario")
.whenScenarioStateIs(Scenario.STARTED)
.willSetStateTo("success")
.willReturn(aResponse().withStatus(503)));
stubFor(get(urlEqualTo("/api/data"))
.inScenario("Retry scenario")
.whenScenarioStateIs("success")
.willReturn(aResponse().withStatus(200).withBody("success")));
}
Проверка запросов (Verification)
@Test
public void testRequestVerification() {
// ... выполняем код ...
// Проверяем, что определённый запрос был сделан
verify(postRequestedFor(urlEqualTo("/api/users"))
.withRequestBody(containing("John")));
// Проверяем количество запросов
verify(3, getRequestedFor(urlEqualTo("/api/data")));
}
Преимущества WireMock
✅ Независимость от внешних сервисов — тесты работают локально
✅ Контроль над ответами — можно тестировать любые сценарии
✅ Быстрое выполнение — нет сетевых задержек
✅ Отладка — легко видеть, какие запросы были сделаны
✅ Детерминированность — одни и те же входные данные дают одинаковые результаты
Когда использовать WireMock?
- Тестирование HTTP клиентов (REST клиенты, WebClient и т.д.)
- Тестирование интеграции с внешними API
- Тестирование обработки ошибок и edge cases
- CI/CD пайплайны, где внешние зависимости недоступны
Резюме
WireMock — это инструмент для mock-ирования HTTP запросов и ответов, позволяющий изолировать тесты от внешних зависимостей. Он критичен в современной Java разработке для создания быстрых, надёжных и независимых unit/integration тестов.