Introduksjon til WireMock

1. Oversikt

WireMock er et bibliotek for stubbing og spottende nettjenester. Den konstruerer en HTTP-server som vi kan koble til som for en faktisk webtjeneste.

Når en WireMock-server er i aksjon, kan vi stille forventninger, ringe tjenesten og deretter bekrefte atferd.

2. Maven-avhengigheter

For å kunne dra nytte av WireMock-biblioteket, må vi inkludere følgende avhengighet i POM:

 com.github.tomakehurst wiremock 1.58 test 

3. Programmatisk administrert server

Denne delen vil dekke måten manuelt konfigurerer en WireMock-server på. dvs. uten støtte fra JUnit auto-konfigurasjon. Bruken er demonstrert av en veldig enkel stub.

3.1. Serveroppsett

En WireMock-server kan instantieres slik:

WireMockServer wireMockServer = ny WireMockServer (strengvert, int-port);

I tilfelle ingen argumenter er gitt, er serververten som standard lokal vert og serverporten til 8080.

Serveren kan deretter startes og stoppes ved hjelp av to enkle metoder:

wireMockServer.start ();

Og:

wireMockServer.stop ();

3.2. Grunnleggende bruk

WireMock-biblioteket vil for det første bli demonstrert av en grunnleggende bruk, der en stub for en nøyaktig URL uten ytterligere konfigurasjon er gitt. La oss opprette en serverforekomst:

WireMockServer wireMockServer = ny WireMockServer ();

WireMock-serveren må kjøre før klienten kobler seg til den:

wireMockServer.start ();

Nettjenesten blir deretter stubbet:

configureFor ("localhost", 8080); stubFor (get (urlEqualTo ("/ baeldung")). willReturn (aResponse (). withBody ("Welcome to Baeldung!")));

Denne opplæringen bruker Apache HttpClient API for å representere en klient som kobler til serveren:

CloseableHttpClient httpClient = HttpClients.createDefault ();

En forespørsel utføres og svaret returneres henholdsvis etterpå:

HttpGet forespørsel = ny HttpGet ("// localhost: 8080 / baeldung"); HttpResponse httpResponse = httpClient.execute (forespørsel);

Vi vil konvertere httpResponse variabel til en String ved hjelp av en hjelpermetode:

String responseString = convertResponseToString (httpResponse);

Her er implementeringen av den konverteringshjelpermetoden:

private String convertResponseToString (HttpResponse respons) kaster IOException {InputStream responseStream = respons.getEntity (). getContent (); Skannerskanner = ny skanner (responseStream, "UTF-8"); StrengresponsString = scanner.useDelimiter ("\ Z"). Neste (); scanner.close (); return responseString; }

Følgende kode bekrefter at serveren har fått en forespørsel til den forventede URL-en, og svaret som kommer til klienten er nøyaktig det som ble sendt:

verifisere (getRequestedFor (urlEqualTo ("/ baeldung"))); assertEquals ("Velkommen til Baeldung!", stringResponse);

Til slutt bør WireMock-serveren stoppes for å frigjøre systemressurser:

wireMockServer.stop ();

4. JUnit Managed Server

I motsetning til seksjon 3 illustrerer denne delen bruken av en WireMock-server ved hjelp av JUnit Regel.

4.1. Serveroppsett

En WireMock-server kan integreres i JUnit-testtilfeller ved å bruke @Regel kommentar. Dette gjør at JUnit kan administrere livssyklusen, starte serveren før hver testmetode og stoppe den etter at metoden kommer tilbake.

I likhet med den programmatisk administrerte serveren, kan en JUnit-administrert WireMock-server opprettes som et Java-objekt med det gitte portnummeret:

@Rule offentlig WireMockRule wireMockRule = ny WireMockRule (int port);

Hvis ingen argumenter leveres, vil serverporten ta standardverdien, 8080. Serververt, som standard lokal vert, og andre konfigurasjoner kan spesifiseres ved hjelp av Alternativer grensesnitt.

4.2. URL-samsvar

Etter å ha satt opp en WireMockRule For eksempel er neste trinn å konfigurere en stub. I dette underavsnittet vil vi gi en REST-stub for et tjenestens endepunkt ved å bruke vanlig uttrykk:

stubFor (get (urlPathMatching ("/ baeldung /.*")) .willReturn (aResponse () .withStatus (200) .withHeader ("Content-Type", "application / json") .withBody ("\" testing-library) \ ": \" WireMock \ "")));

La oss gå videre til å opprette en HTTP-klient, utføre en forespørsel og motta et svar:

CloseableHttpClient httpClient = HttpClients.createDefault (); HttpGet forespørsel = ny HttpGet ("// localhost: 8080 / baeldung / wiremock"); HttpResponse httpResponse = httpClient.execute (forespørsel); String stringResponse = convertHttpResponseToString (httpResponse);

Ovennevnte kodebit benytter seg av en konverteringshjelpemetode:

private String convertHttpResponseToString (HttpResponse httpResponse) kaster IOException {InputStream inputStream = httpResponse.getEntity (). getContent (); return convertInputStreamToString (inputStream); }

Dette bruker igjen en annen privat metode:

private String convertInputStreamToString (InputStream inputStream) {Scanner scanner = new Scanner (inputStream, "UTF-8"); Strengstreng = scanner.useDelimiter ("\ Z"). Neste (); scanner.close (); returstreng; }

Stubbens operasjoner bekreftes av testkoden nedenfor:

verifisere (getRequestedFor (urlEqualTo ("/ baeldung / wiremock")); assertEquals (200, httpResponse.getStatusLine (). getStatusCode ()); assertEquals ("application / json", httpResponse.getFirstHeader ("Content-Type"). getValue ()); assertEquals ("\" testing-library \ ": \" WireMock \ "", stringResponse);

4.3. Be om topptekst

Nå skal vi demonstrere hvordan du kan stanse en REST API med samsvarende overskrifter. La oss starte med stubbkonfigurasjonen:

stubFor (get (urlPathEqualTo ("/ baeldung / wiremock")) .withHeader ("Accept", matching ("text /.*")) .willReturn (aResponse () .withStatus (503) .withHeader ("Content-Type" , "text / html") .withBody ("!!! Tjeneste utilgjengelig !!!")));

I likhet med foregående underavsnitt illustrerer vi HTTP-interaksjon ved hjelp av HttpClient API, ved hjelp av de samme hjelpemetodene:

CloseableHttpClient httpClient = HttpClients.createDefault (); HttpGet forespørsel = ny HttpGet ("// localhost: 8080 / baeldung / wiremock"); request.addHeader ("Godta", "tekst / html"); HttpResponse httpResponse = httpClient.execute (forespørsel); String stringResponse = convertHttpResponseToString (httpResponse);

Følgende verifisering og påstander bekrefter funksjonene til stubben vi opprettet før:

verifisere (getRequestedFor (urlEqualTo ("/ baeldung / wiremock")); assertEquals (503, httpResponse.getStatusLine (). getStatusCode ()); assertEquals ("text / html", httpResponse.getFirstHeader ("Content-Type"). getValue ()); assertEquals ("!!! Tjeneste utilgjengelig !!!", stringResponse);

4.4. Be om kroppsmatching

WireMock-biblioteket kan også brukes til å stoppe et REST API med kroppsmatching. Her er konfigurasjonen for en stub av denne typen:

stubFor (post (urlEqualTo ("/ baeldung / wiremock")) .withHeader ("Content-Type", equalTo ("application / json")) .withRequestBody (inneholder ("\" testing-bibliotek \ ": \" WireMock \ "")) .withRequestBody (inneholder ("\" skaper \ ": \" Tom Akehurst \ "")) .withRequestBody (inneholder ("\" nettsted \ ": \" wiremock.org \ "")) .willReturn ( aResponse () .withStatus (200)));

Nå er det på tide å lage en StringEntity objekt som vil bli brukt som brødtekst i en forespørsel:

InputStream jsonInputStream = this.getClass (). GetClassLoader (). GetResourceAsStream ("wiremock_intro.json"); String jsonString = convertInputStreamToString (jsonInputStream); StringEntity-enhet = ny StringEntity (jsonString);

Koden ovenfor bruker en av konverteringshjelpemetodene som er definert før, convertInputStreamToString.

Her er innholdet i wiremock_intro.json fil på klassestien:

{"testing-library": "WireMock", "creator": "Tom Akehurst", "website": "wiremock.org"}

HTTP-forespørsler og svar kan konfigureres og utføres på følgende måte:

CloseableHttpClient httpClient = HttpClients.createDefault (); HttpPost-forespørsel = ny HttpPost ("// localhost: 8080 / baeldung / wiremock"); request.addHeader ("Content-Type", "application / json"); request.setEntity (enhet); HttpResponse respons = httpClient.execute (forespørsel);

Dette er testkoden som brukes til å validere stubben:

verifisere (postRequestedFor (urlEqualTo ("/ baeldung / wiremock")) .withHeader ("Content-Type", equalTo ("application / json"))); assertEquals (200, respons.getStatusLine (). getStatusCode ());

4.5. Stubprioritet

De forrige underavsnittene omhandler situasjoner der en HTTP-forespørsel bare samsvarer med en enkelt stub. Det ville være mer komplisert hvis det er mer enn en kamp for en forespørsel. Som standard vil den sist tilføyde stubben ha forrang i et slikt tilfelle. Imidlertid har brukerne lov til å tilpasse den oppførselen for å ta mer kontroll over WireMock-stubber.

Vi vil demonstrere operasjonene til en WireMock-server når en kommende forespørsel samsvarer med to forskjellige stubber, med og uten å sette prioritetsnivå, samtidig. Begge scenariene bruker følgende private hjelpermetode:

private HttpResponse generererClientAndReceiveResponseForPriorityTests () kaster IOException {CloseableHttpClient httpClient = HttpClients.createDefault (); HttpGet forespørsel = ny HttpGet ("// localhost: 8080 / baeldung / wiremock"); request.addHeader ("Godta", "tekst / xml"); returner httpClient.execute (forespørsel); }

For det første konfigurerer du to stubber uten å ta hensyn til prioritetsnivået:

stubFor (get (urlPathMatching ("/ baeldung /.*")) .willReturn (aResponse () .withStatus (200))); stubFor (get (urlPathEqualTo ("/ baeldung / wiremock")) .withHeader ("Accept", matching ("text /.*")) .willReturn (aResponse () .withStatus (503)));

Deretter oppretter du en HTTP-klient og utfører en forespørsel ved hjelp av hjelpemetoden beskrevet ovenfor:

HttpResponse httpResponse = genererClientAndReceiveResponseForPriorityTests ();

Følgende kodebit verifiserer at den sist konfigurerte stubben brukes uansett den som er definert før når en forespørsel samsvarer med dem begge:

verifisere (getRequestedFor (urlEqualTo ("/ baeldung / wiremock")); assertEquals (503, httpResponse.getStatusLine (). getStatusCode ());

La oss gå videre til stubber med prioritetsnivåer som er angitt, der et lavere tall representerer en høyere prioritet:

stubFor (get (urlPathMatching ("/ baeldung /.*")) .atPriority (1) .willReturn (aResponse () .withStatus (200))); stubFor (get (urlPathEqualTo ("/ baeldung / wiremock")) .atPriority (2) .withHeader ("Accept", matching ("text /.*")) .willReturn (aResponse () .withStatus (503)));

Opprettelse og gjennomføring av en HTTP-forespørsel:

HttpResponse httpResponse = genererClientAndReceiveResponseForPriorityTests ();

Følgende kode validerer effekten av prioritetsnivåer, der den første konfigurerte stubben brukes i stedet for den siste:

verifisere (getRequestedFor (urlEqualTo ("/ baeldung / wiremock")); assertEquals (200, httpResponse.getStatusLine (). getStatusCode ());

5. Konklusjon

Denne opplæringen introduserte WireMock og hvordan du konfigurerer og konfigurerer dette biblioteket for testing av REST APIer ved hjelp av forskjellige teknikker, inkludert matching av URL, forespørselsoverskrifter og kropp.

Implementeringen av alle eksemplene og kodebiter kan bli funnet i et GitHub-prosjekt.


$config[zx-auto] not found$config[zx-overlay] not found