Einführung in Hoverfly in Java

Einführung in Hoverfly in Java

1. Überblick

In diesem Artikel werfen wir einen Blick auf die Java-Bibliothek vonHoverfly, 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 inhere.

3. API simulieren

Zunächst konfigurieren wir Hoverfly für die Ausführung im Simulationsmodus. The simplest way to define a simulation is by using a DSL.

Beginnen wir mit einem einfachen Beispiel, indem wir die Instanz vonHoverflyRuleinstanziieren:

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'}"))));

Die KlasseSimulationSource bietet eine Methodedsl zum Initiieren der API-Definition. Mit derHoverflyDSL-Methode vonHoverflyDSLkönnen wir auch einen Endpunkt und zugehörige Anforderungspfade definieren.

Dann rufen wirwillReturn auf, um anzugeben, welche Antwort wir als Gegenleistung erhalten möchten. Wir haben auch diesuccess-Methode vonResponseBuilder verwendet, um den Antwortstatus und den Body festzulegen.

4. Verwenden von JUnit zum Testen

Stubbed API kann mit JUnit einfach getestet werden.

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

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());

Wir haben die KlasseninstanzRestTemplatedes 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 das Beispiel für die Verzögerung der Codeeinstellung bei Anforderungen mit der POST-Methode:

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

6. Matcher anfordern

Die Factory-Klasse vonHoverflyMatchersbietet mehrere Matcher, einschließlichexactMatch undglobMatch für URLs. Für HTTP-Body bietet es.

Für HTTP-Körper werden die genauen Übereinstimmungen vonJSON/XMLund die Übereinstimmungen vonJSONPath/XPathangegeben.

Standardmäßig wird derexactMatch-Matcher sowohl für die URL- als auch für die Body-Übereinstimmung 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 überprüft die Methodematchesdie URL mitglobMatch, die die Platzhaltersuche ermöglicht.

Dann prüftstartsWith, ob der Anforderungspfad mit „/api_ / student_“ beginnt. Wir haben den Matcher vonanyverwendet, um alle möglichen Werte im Seitenabfrageparameter zuzulassen.

DerequalsToJson-Matcher stellt sicher, dass die Body-Payload genau dem hier angegebenen JSON entspricht. Die MethodematchesJsonPathzur Überprüfung mit einem Element in einem bestimmten JSON-Pfad ist vorhanden oder nicht.

In ähnlicher Weise stimmtequalsToXml mit dem im Anforderungshauptteil angegebenen XML mit dem hier angegebenen überein. DasmatchesXPath entspricht einem Körper mit einem XPath-Ausdruck.

7. Fazit

In diesem kurzen Tutorial haben wir die Verwendung der Hoverfly-Java-Bibliothek besprochen. Wir haben uns mit der Simulation von HTTP-Diensten und DSL zum Konfigurieren von Endpunkten, dem Hinzufügen von Verzögerungen und der Verwendung von Anforderungsvergleichern befasst. Wir haben uns auch mit dem Testen dieser Dienste mit JUnit befasst.

Wie immer können Codefragmente wie immerover on GitHub gefunden werden.