«1. Обзор

В этой статье мы рассмотрим библиотеку Java Hoverfly, которая обеспечивает простой способ создания реальных заглушек/симуляций API.

2. Зависимости Maven

Чтобы использовать Hoverfly, нам нужно добавить одну зависимость Maven:

<dependency>
    <groupId>io.specto</groupId>
    <artifactId>hoverfly-java</artifactId>
    <version>0.8.1</version>
</dependency>

Новейшую версию можно найти здесь.

3. Симуляция API

Сначала мы настроим Hoverfly для работы в режиме симуляции. Самый простой способ определить симуляцию — использовать DSL.

Давайте начнем с простого примера создания экземпляра HoverflyRule:

public static final HoverflyRule rule
  = HoverflyRule.inSimulationMode(dsl(
    service("http://www.baeldung.com")
      .get("/api/courses/1")
      .willReturn(success().body(
        jsonWithSingleQuotes("{'id':'1','name':'HCI'}"))));

Класс SimulationSource предоставляет метод dsl для инициации определения API. Кроме того, сервисный метод HoverflyDSL позволяет нам определить конечную точку и связанные с ней пути запросов.

Затем мы вызываем willReturn, чтобы указать, какой ответ мы хотим получить взамен. Мы также использовали метод успеха ResponseBuilder для установки статуса и тела ответа.

4. Использование JUnit для тестирования

Заглушенный API можно легко протестировать с помощью JUnit.

Давайте создадим простой тест, отправляющий HTTP-запрос, и посмотрим, достигнет ли он конечной точки:

responseEntity<String> courseResponse
  = restTemplate.getForEntity("http://www.baeldung.com/api/courses/1", String.class);
 
assertEquals(HttpStatus.OK, courseResponse.getStatusCode());
assertEquals("{\"id\":\"1\",\"name\":\"HCI\"}", courseResponse.getBody());

Мы использовали экземпляр класса RestTemplate модуля Spring Web для отправки HTTP-запроса.

5. Добавление задержек

Задержки можно добавлять глобально, для определенного метода HTTP или для определенного вызова API.

Вот пример кода, устанавливающего задержку для запросов с помощью метода POST:

SimulationSource.dsl(
  service("http://www.baeldung.com")
    .post("/api/courses")
    .willReturn(success())
    .andDelay(3, TimeUnit.SECONDS)
    .forMethod("POST")
)

6. Сопоставитель запросов

Фабричный класс HoverflyMatchers предоставляет несколько сопоставителей, включая точное соответствие и globMatch для URL-адресов. Для тела HTTP он предоставляет.

Для тел HTTP он обеспечивает точное соответствие JSON/XML и совпадения JSONPath/XPath.

По умолчанию сопоставитель точного соответствия используется как для сопоставления URL, так и для тела.

Вот пример использования различных сопоставителей:

SimulationSource.dsl(
  service(matches("www.*dung.com"))
    .get(startsWith("/api/student")) 
    .queryParam("page", any()) 
    .willReturn(success())
 
    .post(equalsTo("/api/student"))
    .body(equalsToJson(jsonWithSingleQuotes("{'id':'1','name':'Joe'}")))
    .willReturn(success())
 
    .put("/api/student/1")
    .body(matchesJsonPath("$.name")) 
    .willReturn(success())
 
    .post("/api/student")
    .body(equalsToXml("<student><id>2</id><name>John</name></student>"))
    .willReturn(success())
 
    .put("/api/student/2")
    .body(matchesXPath("/student/name")) 
    .willReturn(success()));
)

В этом примере метод matches проверяет URL с помощью globMatch, что позволяет выполнять поиск по подстановочным знакам.

Затем opensWith проверяет, начинается ли путь запроса с «/api/student». Мы использовали любой сопоставитель, чтобы разрешить все возможные значения в параметре запроса страницы.

Сопоставитель equalsToJson гарантирует, что полезная нагрузка тела точно соответствует указанному здесь JSON. Метод matchJsonPath для проверки наличия или отсутствия элемента в определенном пути JSON.

Точно так же equalsToXml сопоставляет XML, указанный в теле запроса, с тем, который указан здесь. MatchXPath сопоставляет тело с выражением XPath.

7. Заключение

В этом кратком руководстве мы обсудили использование библиотеки Java Hoverfly. Мы рассмотрели симуляцию служб HTTP, DSL для настройки конечных точек, добавление задержек и использование сопоставителей запросов. Мы также рассмотрели возможность тестирования этих сервисов с помощью JUnit.

Как обычно, фрагменты кода можно найти на GitHub.