Einführung in Hoverfly in Java

1. Übersicht

In diesem Artikel werfen wir einen Blick auf die Hoverfly Java-Bibliothek, mit der Sie auf einfache Weise echte API-Stubs / Simulationen erstellen können.

2. Maven-Abhängigkeiten

Um Hoverfly verwenden zu können, müssen wir eine einzelne Maven-Abhängigkeit hinzufügen:

 io.specto hoverfly-java 0.8.1 

Die neueste Version finden Sie hier.

3. Eine API simulieren

Zuerst konfigurieren wir Hoverfly so, dass es im Simulationsmodus ausgeführt wird. Der einfachste Weg, eine Simulation zu definieren, ist die Verwendung von DSL.

Beginnen wir mit einem einfachen Beispiel, indem wir die HoverflyRule- Instanz instanziieren:

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

Die SimulationSource- Klasse bietet eine DSL- Methode zum Initiieren der API-Definition. Auch HoverflyDSL ‚s Service Verfahren ermöglicht es uns , einen Endpunkt und zugehörige Anforderungswege zu definieren.

Dann rufen wir willReturn auf, um anzugeben , welche Antwort wir als Gegenleistung erhalten möchten. Wir haben auch die Erfolgsmethode von ResponseBuilder verwendet , um den Antwortstatus und den Text festzulegen.

4. Verwenden von JUnit zum Testen

Stubbed API kann einfach mit JUnit getestet werden.

Erstellen wir einen einfachen Test zum Senden einer HTTP-Anforderung und prüfen, ob sie den Endpunkt erreicht:

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

Wir haben die RestTemplate- Klasseninstanz des Spring Web-Moduls verwendet , um eine HTTP-Anforderung zu senden.

5. Verzögerungen hinzufügen

Verzögerungen können global hinzugefügt werden, für eine bestimmte HTTP-Methode oder für einen bestimmten API-Aufruf.

Hier ist die Verzögerung beim Einstellen des Beispielcodes für Anforderungen mit der POST-Methode:

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

6. Matcher anfordern

Die Factory-Klasse von HoverflyMatchers bietet mehrere Matcher, einschließlich exaktem Match und globMatch für URLs. Für HTTP-Body bietet es.

Für HTTP-Körper werden JSON / XML- Übereinstimmungen und JSONPath / XPath- Übereinstimmungen bereitgestellt .

Standardmäßig wird der ExactMatch- Matcher sowohl für den URL- als auch für den Body-Matching verwendet.

Hier ist ein Beispiel für die Verwendung verschiedener Matcher:

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("2John")) .willReturn(success()) .put("/api/student/2") .body(matchesXPath("/student/name")) .willReturn(success())); )

In diesem Beispiel entspricht Methode überprüft URL mit globMatch , die Wildcard - Suche ermöglicht.

Dann starts prüfen , ob der Anforderungspfad beginnt mit „ / api / Student „. Wir haben einen beliebigen Matcher verwendet, um alle möglichen Werte im Seitenabfrageparameter zuzulassen.

Der equalsToJson- Matcher stellt sicher, dass die Body-Payload genau dem hier angegebenen JSON entspricht. Die matchJsonPath- Methode zum Überprüfen mit einem Element in einem bestimmten JSON-Pfad ist vorhanden oder nicht.

In ähnlicher Weise stimmt equalsToXml mit dem im Anforderungshauptteil angegebenen XML mit dem hier angegebenen überein . Der matchXPath entspricht einem Body mit einem XPath-Ausdruck.

7. Fazit

In diesem kurzen Tutorial haben wir die Verwendung der Hoverfly Java-Bibliothek erläutert. Wir haben uns mit der Simulation von HTTP-Diensten und DSL zur Konfiguration von Endpunkten, dem Hinzufügen von Verzögerungen und der Verwendung von Anforderungs-Matchern befasst. Wir haben uns auch mit dem Testen dieser Dienste mit JUnit befasst.

Wie immer finden Sie Code-Schnipsel wie immer auf GitHub.