Introduzione a Hoverfly in Java

1. Panoramica

In questo articolo, daremo uno sguardo alla libreria Java Hoverfly, che fornisce un modo semplice per creare stub / simulazioni API reali.

2. Dipendenze di Maven

Per utilizzare Hoverfly, dobbiamo aggiungere una singola dipendenza Maven:

 io.specto hoverfly-java 0.8.1 

La versione più recente può essere trovata qui.

3. Simulazione di un'API

Innanzitutto, configureremo Hoverfly per l'esecuzione in modalità di simulazione. Il modo più semplice per definire una simulazione è utilizzare un DSL.

Cominciamo con un semplice esempio istanziando l' istanza HoverflyRule :

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

La classe SimulationSource fornisce un metodo dsl per avviare la definizione dell'API. Inoltre, il metodo di servizio di HoverflyDSL ci consente di definire un endpoint e percorsi di richiesta associati.

Quindi chiamiamo willReturn per indicare quale risposta vogliamo ottenere in cambio. Abbiamo anche utilizzato il metodo di successo di ResponseBuilder per impostare lo stato e il corpo della risposta.

4. Utilizzo di JUnit per il test

L'API Stubbed può essere facilmente testata utilizzando JUnit.

Creiamo un semplice test inviando una richiesta HTTP e vediamo se raggiunge l'endpoint:

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

Abbiamo utilizzato l' istanza della classe RestTemplate del modulo Spring Web per inviare una richiesta HTTP.

5. Aggiunta di ritardi

È possibile aggiungere ritardi a livello globale, per un particolare metodo HTTP o per una specifica chiamata API.

Di seguito è riportato il ritardo dell'impostazione del codice di esempio sulle richieste con il metodo POST:

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

6. Richiedi Matcher

La classe factory HoverflyMatchers fornisce diversi abbinamenti tra cui exactMatch e globMatch per gli URL. Per il corpo HTTP fornisce.

Per i corpi HTTP fornisce la corrispondenza esatta JSON / XML e le corrispondenze JSONPath / XPath .

Per impostazione predefinita, il matcher exactMatch viene utilizzato sia per l'URL che per la corrispondenza del corpo.

Ecco un esempio di utilizzo di diversi 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 questo esempio, partite controlli metodo URL con globMatch che permette ricerca con caratteri jolly.

Quindi inizia con verifica se il percorso della richiesta inizia con " / api / student ". Abbiamo utilizzato qualsiasi matcher per consentire tutti i valori possibili nel parametro di query della pagina.

Il matcher equalsToJson si assicura che il payload del corpo corrisponda esattamente al JSON fornito qui. Il metodo matchJsonPath per il controllo con un elemento in un particolare percorso JSON esiste o meno.

Allo stesso modo, equalsToXml corrisponde all'XML fornito nel corpo della richiesta con quello fornito qui. Il matchesXPath corrisponde a un corpo con un'espressione XPath.

7. Conclusione

In questo breve tutorial, abbiamo discusso dell'utilizzo della libreria Java Hoverfly. Abbiamo esaminato la simulazione di servizi HTTP, DSL per la configurazione degli endpoint, l'aggiunta di ritardi e l'uso di corrispondenze di richieste. Abbiamo anche esaminato la possibilità di testare questi servizi utilizzando JUnit.

Come sempre, gli snippet di codice, come sempre, possono essere trovati su GitHub.