← Назад к вопросам

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

2.0 Middle🔥 161 комментариев
#Тестирование

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# 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 тестов.