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 .