Перейти к основному содержимому

Введение в Hoverfly на Java

· 3 мин. чтения

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.foreach.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.foreach.com/api/courses/1", String.class);

assertEquals(HttpStatus.OK, courseResponse.getStatusCode());
assertEquals("{\"id\":\"1\",\"name\":\"HCI\"}", courseResponse.getBody());

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

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

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

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

SimulationSource.dsl(
service("http://www.foreach.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()));
)

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

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

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

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

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

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

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