Введение в Hoverfly на Java
1. обзор
В этой статье мы рассмотрим библиотеку JavaHoverfly, которая обеспечивает простой способ создания реальных заглушек / симуляций API.
2. Maven Зависимости
Чтобы использовать Hoverfly, нам нужно добавить одну зависимость Maven:
io.specto
hoverfly-java
0.8.1
Последнюю версию можно найтиhere.
3. Имитация API
Сначала мы настроим Hoverfly для работы в режиме симуляции. The simplest way to define a simulation is by using a DSL.с
Начнем с простого примера, создав экземплярHoverflyRule:
public static final HoverflyRule rule
= HoverflyRule.inSimulationMode(dsl(
service("http://www.example.com")
.get("/api/courses/1")
.willReturn(success().body(
jsonWithSingleQuotes("{'id':'1','name':'HCI'}"))));
КлассSimulationSource предоставляет методdsl для инициирования определения API. Кроме того, методHoverflyDSL'sservice позволяет нам определять конечную точку и связанные пути запросов.
Затем мы вызываемwillReturn, чтобы указать, какой ответ мы хотим получить взамен. Мы также использовали методsuccess дляResponseBuilder, чтобы установить статус и тело ответа.
4. Использование JUnit для тестирования
Стабильный API может быть легко протестирован с помощью JUnit.
Давайте создадим простой тест, отправляющий HTTP-запрос, и посмотрим, достигает ли он конечной точки:
responseEntity courseResponse
= restTemplate.getForEntity("http://www.example.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.example.com")
.post("/api/courses")
.willReturn(success())
.andDelay(3, TimeUnit.SECONDS)
.forMethod("POST")
)
6. Запрос соответствия
Класс фабрикиHoverflyMatchers предоставляет несколько сопоставителей, включаяexactMatch иglobMatch для URL-адресов. Для тела HTTP это обеспечивает.
Для тел HTTP он обеспечивает точное совпадениеJSON/XML и совпадениеJSONPath/XPath.
По умолчанию сопоставлениеexactMatch используется как для сопоставления 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("2 John "))
.willReturn(success())
.put("/api/student/2")
.body(matchesXPath("/student/name"))
.willReturn(success()));
)
В этом примере методmatches проверяет URL-адрес с помощьюglobMatch, который разрешает поиск по шаблону.
ЗатемstartsWith проверяет, начинается ли путь запроса с «/api_ / student_». Мы использовали сопоставительany, чтобы разрешить все возможные значения в параметре запроса страницы.
СопоставительequalsToJson гарантирует, что полезная нагрузка тела соответствует точному JSON, указанному здесь. МетодmatchesJsonPath для проверки с элементом на определенном пути JSON существует или нет.
Точно так жеequalsToXml сопоставляет XML, указанный в теле запроса, с представленным здесь. matchesXPath соответствует телу с выражением XPath.
7. Заключение
В этом кратком руководстве мы обсудили использование библиотеки Java Hoverfly. Мы рассмотрели симуляцию HTTP-сервисов, DSL для настройки конечных точек, добавления задержек и использования сопоставителей запросов. Мы также изучили тестирование этих сервисов с использованием JUnit.
Как всегда, фрагменты кода, как всегда, можно найтиover on GitHub.