Uvod u WireMock

1. Pregled

WireMock je knjižnica za sprdavanje i ismijavanje web usluga. Izrađuje HTTP poslužitelj na koji bismo se mogli povezati kao na stvarnu web uslugu.

Kada je WireMock poslužitelj u akciji, možemo postaviti očekivanja, nazvati uslugu i zatim provjeriti njegovo ponašanje.

2. Ovisnosti Mavena

Da bismo mogli iskoristiti prednost knjižnice WireMock, u POM moramo uključiti sljedeću ovisnost:

 com.github.tomakehurst wiremock 1.58 test 

3. Programski upravljani poslužitelj

Ovaj će odjeljak opisati način ručnog konfiguriranja WireMock poslužitelja. tj. bez podrške JUnit auto-konfiguracije. Korištenje je prikazano vrlo jednostavnim klatnom.

3.1. Postavljanje poslužitelja

Instanciranje WireMock poslužitelja može se izvršiti ovako:

WireMockServer wireMockServer = novi WireMockServer (stringni host, int port);

U slučaju da se ne daju argumenti, zadani server poslužitelja je lokalnihost a port poslužitelja na 8080.

Poslužitelj se tada može pokrenuti i zaustaviti pomoću dvije jednostavne metode:

wireMockServer.start ();

I:

wireMockServer.stop ();

3.2. Osnovna upotreba

Biblioteka WireMock prvo će biti prikazana osnovnom uporabom, gdje je predviđen klip za točan URL bez daljnje konfiguracije. Stvorimo instancu poslužitelja:

WireMockServer wireMockServer = novi WireMockServer ();

Prije nego što se klijent spoji na njega, poslužitelj WireMock mora biti pokrenut:

wireMockServer.start ();

Web usluga se zatim ugasi:

configureFor ("localhost", 8080); stubFor (get (urlEqualTo ("/ baeldung")). willReturn (aResponse (). withBody ("Dobrodošli u Baeldung!")));

Ovaj se vodič koristi API-jem Apache HttpClient za predstavljanje klijenta koji se povezuje s poslužiteljem:

CloseableHttpClient httpClient = HttpClients.createDefault ();

Zahtjev se izvršava, a odgovor se nakon toga vraća:

Zahtjev za HttpGet = novi HttpGet ("// localhost: 8080 / baeldung"); HttpResponse httpResponse = httpClient.execute (zahtjev);

Pretvorit ćemo httpResponse promjenjiva na a Niz pomoću pomoćne metode:

Niz responseString = convertResponseToString (httpResponse);

Evo implementacije te pomoćne metode pretvorbe:

private String convertResponseToString (HttpResponse response) baca IOException {InputStream responseStream = response.getEntity (). getContent (); Skener skenera = novi Skener (responseStream, "UTF-8"); String responseString = scanner.useDelimiter ("\ Z"). Next (); scanner.close (); povratak responseString; }

Sljedeći kôd potvrđuje da je poslužitelj dobio zahtjev za očekivanim URL-om i da je odgovor koji stiže klijentu točno ono što je poslan:

provjeri (getRequestFor (urlEqualTo ("/ baeldung"))); assertEquals ("Dobro došli u Baeldung!", stringResponse);

Na kraju, WireMock poslužitelj treba zaustaviti kako bi se oslobodili sistemski resursi:

wireMockServer.stop ();

4. JUnit upravljani poslužitelj

Za razliku od odjeljka 3, ovaj odjeljak ilustrira upotrebu WireMock poslužitelja uz pomoć JUnit-a Pravilo.

4.1. Postavljanje poslužitelja

WireMock poslužitelj može se integrirati u JUnit test slučajeve pomoću @Pravilo bilješka. To omogućuje JUnit-u upravljanje životnim ciklusom, pokretanje poslužitelja prije svake metode ispitivanja i zaustavljanje nakon što se metoda vrati.

Slično kao programski upravljani poslužitelj, JUnit upravljani WireMock poslužitelj može se stvoriti kao Java objekt s danim brojem porta:

@Rule public WireMockRule wireMockRule = new WireMockRule (int port);

Ako nisu dostavljeni argumenti, poslužiteljski priključak poprimit će zadanu vrijednost, 8080. Domaćin poslužitelja, prema zadanim postavkama lokalnihost, i druge konfiguracije mogu se navesti pomoću Opcije sučelje.

4.2. URL podudaranje

Nakon postavljanja a WireMockRule Primjerice, sljedeći je korak konfiguriranje klizača. U ovom pododjeljku pružit ćemo REST klat za krajnju točku usluge koristeći regularni izraz:

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

Prijeđimo na stvaranje HTTP klijenta, izvršavanje zahtjeva i primit ćemo odgovor:

CloseableHttpClient httpClient = HttpClients.createDefault (); Zahtjev za HttpGet = novi HttpGet ("// localhost: 8080 / baeldung / wiremock"); HttpResponse httpResponse = httpClient.execute (zahtjev); Niz stringResponse = convertHttpResponseToString (httpResponse);

Gornji isječak koda koristi prednost metode pomoćne konverzije:

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

Ovo pak koristi drugu privatnu metodu:

private String convertInputStreamToString (InputStream inputStream) {Skener skenera = novi skener (inputStream, "UTF-8"); Niz niza = scanner.useDelimiter ("\ Z"). Next (); scanner.close (); povratni niz; }

Radovi kvara potvrđeni su testnim kodom u nastavku:

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

4.3. Zahtjev za podudaranje zaglavlja

Sada ćemo pokazati kako umanjiti REST API podudaranjem zaglavlja. Počnimo s konfiguracijom klizača:

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

Slično prethodnom pododjeljku, ilustriramo HTTP interakciju pomoću HttpClient API-ja, uz pomoć istih pomoćnih metoda:

CloseableHttpClient httpClient = HttpClients.createDefault (); Zahtjev za HttpGet = novi HttpGet ("// localhost: 8080 / baeldung / wiremock"); request.addHeader ("Prihvati", "tekst / html"); HttpResponse httpResponse = httpClient.execute (zahtjev); Niz stringResponse = convertHttpResponseToString (httpResponse);

Sljedeće provjere i tvrdnje potvrđuju funkcije kvara koji smo stvorili prije:

provjeri (getRequestFor (urlEqualTo ("/ baeldung / wiremock"))); assertEquals (503, httpResponse.getStatusLine (). getStatusCode ()); assertEquals ("text / html", httpResponse.getFirstHeader ("Content-Type"). getValue ()); assertEquals ("!!! Usluga nije dostupna !!!", stringResponse);

4.4. Zatraži podudaranje tijela

Biblioteka WireMock također se može koristiti za uklanjanje REST API-ja s podudaranjem tijela. Evo konfiguracije za ovu vrstu klica:

stubFor (post (urlEqualTo ("/ baeldung / wiremock")) .withHeader ("Content-Type", jednakTo ("application / json")) .withRequestBody (sadrži ("\" testing-library \ ": \" WireMock \ "")) .withRequestBody (sadrži ("\" kreator \ ": \" Tom Akehurst \ "")) .withRequestBody (sadrži ("\" web mjesto \ ": \" wiremock.org \ "")) .willReturn ( aResponse () .withStatus (200)));

Sada je vrijeme za stvaranje a StringEntity objekt koji će se koristiti kao tijelo zahtjeva:

InputStream jsonInputStream = this.getClass (). GetClassLoader (). GetResourceAsStream ("wiremock_intro.json"); Niz jsonString = convertInputStreamToString (jsonInputStream); StringEntity entitet = novi StringEntity (jsonString);

Gornji kod koristi jednu od metoda pomoćnika pretvorbe definiranih prije, convertInputStreamToString.

Ovdje je sadržaj wiremock_intro.json datoteka na putu predavanja:

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

HTTP zahtjevi i odgovori mogu se konfigurirati i izvršiti na sljedeći način:

CloseableHttpClient httpClient = HttpClients.createDefault (); Zahtjev za HttpPost = novi HttpPost ("// localhost: 8080 / baeldung / wiremock"); request.addHeader ("Content-Type", "application / json"); request.setEntity (entitet); HttpResponse odgovor = httpClient.execute (zahtjev);

Ovo je testni kod koji se koristi za provjeru valjanosti:

verify (postRequestFor (urlEqualTo ("/ baeldung / wiremock")) .withHeader ("Content-Type", jednakTo ("application / json"))); assertEquals (200, response.getStatusLine (). getStatusCode ());

4.5. Stub Prioritet

Prethodna pododjeljka bave se situacijama u kojima se HTTP zahtjev podudara samo s jednim stubom. Bilo bi složenije da postoji više od podudaranja zahtjeva. Prema zadanim postavkama, u tom će slučaju prednost imati nedavno dodani klat. Međutim, korisnicima je dopušteno prilagoditi to ponašanje kako bi preuzeli veću kontrolu nad WireMock-om.

Pokazat ćemo rad WireMock poslužitelja kada se nadolazeći zahtjev istovremeno podudara s dva različita kvara, sa i bez postavljanja razine prioriteta. Oba scenarija koristit će sljedeću metodu privatnog pomoćnika:

private HttpResponse generiraClientAndReceiveResponseForPriorityTests () baca IOException {CloseableHttpClient httpClient = HttpClients.createDefault (); Zahtjev za HttpGet = novi HttpGet ("// localhost: 8080 / baeldung / wiremock"); request.addHeader ("Prihvati", "tekst / xml"); vratiti httpClient.execute (zahtjev); }

Prvo konfigurirajte dva klina bez obzira na razinu prioriteta:

stubFor (get (urlPathMatching ("/ baeldung /.*")) .willReturn (aResponse () .withStatus (200))); stubFor (get (urlPathEqualTo ("/ baeldung / wiremock")) .withHeader ("Prihvati", podudaranje ("tekst /.*")) .willReturn (aResponse () .withStatus (503)));

Zatim stvorite HTTP klijenta i izvršite zahtjev pomoću pomoćne metode koja je gore opisana:

HttpResponse httpResponse = generirajClientAndReceiveResponseForPriorityTests ();

Sljedeći isječak koda provjerava je li primijenjen zadnji konfigurirani klinac bez obzira na onaj definiran prije kada se zahtjev podudara s obojicom:

provjeri (getRequestFor (urlEqualTo ("/ baeldung / wiremock"))); assertEquals (503, httpResponse.getStatusLine (). getStatusCode ());

Prijeđimo na kvarove s postavljenim razinama prioriteta, gdje manji broj predstavlja veći 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)));

Izrada i izvršavanje HTTP zahtjeva:

HttpResponse httpResponse = generirajClientAndReceiveResponseForPriorityTests ();

Sljedeći kod provjerava učinak razina prioriteta, gdje se umjesto konfiguracije primjenjuje prvi konfigurirani stupac:

provjeri (getRequestFor (urlEqualTo ("/ baeldung / wiremock"))); assertEquals (200, httpResponse.getStatusLine (). getStatusCode ());

5. Zaključak

Ovaj je vodič predstavio WireMock i kako ga postaviti, kao i konfigurirati ovu biblioteku za testiranje REST API-ja koristeći razne tehnike, uključujući podudaranje URL-a, zaglavlja zahtjeva i tijela.

Implementacija svih primjera i isječaka koda mogu se naći u projektu GitHub.


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