Introduction à Hoverfly en Java

Introduction à Hoverfly en Java

1. Vue d'ensemble

Dans cet article, nous allons examiner la bibliothèque Java deHoverfly, qui offre un moyen simple de créer de vrais stubs / simulations d'API.

2. Dépendances Maven

Pour utiliser Hoverfly, nous devons ajouter une seule dépendance Maven:


    io.specto
    hoverfly-java
    0.8.1

La dernière version peut être trouvéehere.

3. Simuler une API

Tout d'abord, nous allons configurer Hoverfly pour qu'il s'exécute en mode simulation. The simplest way to define a simulation is by using a DSL.

Commençons par un exemple simple en instanciant l'instanceHoverflyRule:

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

La classeSimulationSource fournit une méthodedsl pour lancer la définition d'API. De plus, la méthodeservice deHoverflyDSL nous permet de définir un point de terminaison et les chemins de requête associés.

Ensuite, nous appelonswillReturn pour indiquer la réponse que nous voulons obtenir en retour. Nous avons également utilisé la méthodesuccess deResponseBuilder pour définir le statut et le corps de la réponse.

4. Utilisation de JUnit pour les tests

L'API Stubbed peut être facilement testée avec JUnit.

Créons un test simple en envoyant une requête HTTP et voyons si elle atteint le point de terminaison:

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

Nous avons utilisé l'instance de classeRestTemplate du module Spring Web pour envoyer une requête HTTP.

5. Ajout de retards

Des délais peuvent être ajoutés globalement, pour une méthode HTTP particulière ou pour un appel API spécifique.

Voici l'exemple de code qui définit le délai sur les requêtes avec la méthode POST:

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

6. Demander Matcher

La classe d'usineHoverflyMatchers fournit plusieurs correspondances, y comprisexactMatch etglobMatch pour les URL. Pour le corps HTTP, il fournit.

Pour les corps HTTP, il fournit la correspondance exacteJSON/XML et les correspondancesJSONPath/XPath.

Par défaut, le matcherexactMatch est utilisé à la fois pour la correspondance URL et corps.

Voici un exemple d'utilisation de différents matchers:

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

Dans cet exemple, la méthodematches vérifie l'URL avecglobMatch qui permet la recherche par caractères génériques.

Ensuite,startsWith vérifie si le chemin de la requête commence par «/api_ / student_». Nous avons utilisé le matcherany pour autoriser toutes les valeurs possibles dans le paramètre de requête de page.

Le matcherequalsToJson s'assure que la charge utile du corps correspond au JSON exact donné ici. La méthodematchesJsonPath pour vérifier avec un élément à un chemin JSON particulier existe ou non.

De même,equalsToXml correspond au XML donné dans le corps de la requête avec celui donné ici. LematchesXPath correspond à un corps avec une expression XPath.

7. Conclusion

Dans ce rapide tutoriel, nous avons discuté de l'utilisation de la bibliothèque Java Hoverfly. Nous nous sommes penchés sur la simulation des services HTTP, DSL pour la configuration des points de terminaison, l’ajout de retards et l’utilisation de correspondeurs de demandes. Nous avons également examiné la possibilité de tester ces services avec JUnit.

Comme toujours, des extraits de code, comme toujours, peuvent être trouvésover on GitHub.