Úvod do aplikácie WireMock

1. Prehľad

WireMock je knižnica na blokovanie a vysmievanie sa webovým službám. Zostavuje server HTTP, ku ktorému by sme sa mohli pripojiť, ako by sme sa pripojili k skutočnej webovej službe.

Keď je server WireMock v akcii, môžeme nastaviť očakávania, zavolať službu a potom overiť jej správanie.

2. Maven závislosti

Aby sme mohli využívať výhody knižnice WireMock, musíme do POM zahrnúť nasledujúcu závislosť:

 com.github.tomakehurst wiremock 1,58 test 

3. Programovo riadený server

Táto časť sa bude zaoberať spôsobom manuálnej konfigurácie servera WireMock. tj. bez podpory automatickej konfigurácie JUnit. Použitie je demonštrované veľmi jednoduchým pahýľom.

3.1. Nastavenie servera

Server WireMock je možné inštancovať takto:

WireMockServer wireMockServer = nový WireMockServer (hostiteľ reťazca, int port);

Ak nie sú poskytnuté žiadne argumenty, hostiteľ servera je predvolene nastavený na localhost a port servera na server 8080.

Server možno potom spustiť a zastaviť pomocou dvoch jednoduchých metód:

wireMockServer.start ();

A:

wireMockServer.stop ();

3.2. Základné použitie

Knižnica WireMock bude najskôr demonštrovaná základným použitím, kde je k dispozícii útržok presnej adresy URL bez akejkoľvek ďalšej konfigurácie. Vytvorme inštanciu servera:

WireMockServer wireMockServer = nový WireMockServer ();

Server WireMock musí byť spustený skôr, ako sa k nemu klient pripojí:

wireMockServer.start ();

Webová služba je potom zablokovaná:

configureFor ("localhost", 8080); stubFor (get (urlEqualTo ("/ baeldung")). willReturn (aResponse (). withBody ("Vitajte v Baeldungu!")));

Tento výukový program využíva API Apache HttpClient na zastupovanie klienta pripájajúceho sa k serveru:

CloseableHttpClient httpClient = HttpClients.createDefault ();

Požiadavka sa vykoná a následne sa vráti odpoveď:

HttpGet request = new HttpGet ("// localhost: 8080 / baeldung"); HttpResponse httpResponse = httpClient.execute (požiadavka);

Prevedieme httpResponse premenná na a String pomocou pomocnej metódy:

Reťazec responseString = convertResponseToString (httpResponse);

Tu je implementácia tejto metódy pomocnej konverzie:

private String convertResponseToString (HttpResponse response) hodí IOException {InputStream responseStream = response.getEntity (). getContent (); Skener skener = nový skener (responseStream, "UTF-8"); Reťazec responseString = scanner.useDelimiter ("\ Z"). Next (); scanner.close (); návrat responseString; }

Nasledujúci kód overuje, že server dostal požiadavku na očakávanú adresu URL a že odpoveď prichádzajúca na klienta je presne tá, ktorá bola odoslaná:

verify (getRequestedFor (urlEqualTo ("/ baeldung"))); assertEquals ("Vitajte v Baeldungu!", stringResponse);

Nakoniec by mal byť server WireMock zastavený, aby uvoľnil systémové prostriedky:

wireMockServer.stop ();

4. Spravovaný server JUnit

Na rozdiel od časti 3 táto časť ilustruje použitie servera WireMock pomocou JUnit Pravidlo.

4.1. Nastavenie servera

Server WireMock je možné integrovať do testovacích prípadov JUnit pomocou @ Pravidlo anotácia. Toto umožňuje JUnit spravovať životný cyklus, spúšťať server pred každou testovacou metódou a zastaviť ju po návrate metódy.

Podobne ako programovo spravovaný server, aj server WireMock spravovaný serverom JUnit je možné vytvoriť ako objekt Java s daným číslom portu:

@Rule public WireMockRule wireMockRule = nový WireMockRule (int port);

Ak nie sú zadané žiadne argumenty, port servera bude mať predvolenú hodnotu, 8080. Hostiteľ servera, predvolene localhosta ďalšie konfigurácie je možné určiť pomocou možnosti rozhranie.

4.2. Zhoda URL

Po založení a WireMockRule Ďalším krokom je konfigurácia pahýľa. V tejto podsekcii poskytneme REST stub pre koncový bod služby pomocou regulárneho výrazu:

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

Prejdime k vytvoreniu klienta HTTP, vykonaniu požiadavky a prijatiu odpovede:

CloseableHttpClient httpClient = HttpClients.createDefault (); HttpGet request = new HttpGet ("// localhost: 8080 / baeldung / wiremock"); HttpResponse httpResponse = httpClient.execute (požiadavka); String stringResponse = convertHttpResponseToString (httpResponse);

Vyššie uvedený útržok kódu využíva metódu pomocnej konverzie:

private String convertHttpResponseToString (HttpResponse httpResponse) vrhá IOException {InputStream inputStream = httpResponse.getEntity (). getContent (); návrat convertInputStreamToString (inputStream); }

Toto zase využíva inú súkromnú metódu:

private String convertInputStreamToString (InputStream inputStream) {Scanner scanner = new Scanner (inputStream, "UTF-8"); Reťazcový reťazec = scanner.useDelimiter ("\ Z"). Next (); scanner.close (); spätný reťazec; }

Činnosti pahýľa sú overené nižšie uvedeným testovacím kódom:

verifikácia (getRequestedFor (urlEqualTo ("/ baeldung / wiremock"))); assertEquals (200, httpResponse.getStatusLine (). getStatusCode ()); assertEquals ("application / json", httpResponse.getFirstHeader ("Content-Type"). getValue ()); assertEquals ("\" testovacia knižnica \ ": \" WireMock \ "", stringResponse);

4.3. Požiadajte o priradenie hlavičky

Teraz si ukážeme, ako vložiť REST API s párovaním hlavičiek. Začnime s konfiguráciou pahýľa:

stubFor (get (urlPathEqualTo ("/ baeldung / wiremock")) .withHeader ("Accept", matching ("text /.*")) .willReturn (aResponse () .withStatus (503) .withHeader ("Content-Type") , „text / html“) .withBody („!!! Služba nie je k dispozícii !!!“)));

Podobne ako v predchádzajúcom pododdiele ilustrujeme interakciu HTTP pomocou rozhrania HttpClient API pomocou rovnakých pomocných metód:

CloseableHttpClient httpClient = HttpClients.createDefault (); HttpGet request = new HttpGet ("// localhost: 8080 / baeldung / wiremock"); request.addHeader ("Prijať", "text / html"); HttpResponse httpResponse = httpClient.execute (požiadavka); String stringResponse = convertHttpResponseToString (httpResponse);

Nasledujúce overenia a tvrdenia potvrdzujú funkcie pahýľa, ktorý sme vytvorili predtým:

verifikácia (getRequestedFor (urlEqualTo ("/ baeldung / wiremock"))); assertEquals (503, httpResponse.getStatusLine (). getStatusCode ()); assertEquals ("text / html", httpResponse.getFirstHeader ("Content-Type"). getValue ()); assertEquals ("!!! Služba nedostupná !!!", stringResponse);

4.4. Vyžiadajte si priradenie tela

Knižnicu WireMock je možné použiť aj na nahradenie rozhrania REST API pomocou zhody tela. Tu je konfigurácia pahýľa tohto druhu:

stubFor (post (urlEqualTo ("/ baeldung / wiremock")) .withHeader ("Content-Type", equalTo ("application / json")) .withRequestBody (obsahujúci ("\" testovacia knižnica \ ": \" WireMock \ "")) .withRequestBody (obsahuje ("\" tvorca \ ": \" Tom Akehurst \ "")) .withRequestBody (obsahuje ("\" web \ ": \" wiremock.org \ "")) .willReturn ( aResponse () .withStatus (200)));

Teraz je čas vytvoriť StringEntity objekt, ktorý sa použije ako telo žiadosti:

InputStream jsonInputStream = this.getClass (). GetClassLoader (). GetResourceAsStream ("wiremock_intro.json"); Reťazec jsonString = convertInputStreamToString (jsonInputStream); StringEntity entity = new StringEntity (jsonString);

Vyššie uvedený kód používa jednu z metód pomocnej konverzie definovaných predtým, convertInputStreamToString.

Tu je obsah wiremock_intro.json súbor na triednej ceste:

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

HTTP požiadavky a odpovede je možné nakonfigurovať a vykonať nasledovne:

CloseableHttpClient httpClient = HttpClients.createDefault (); HttpPost request = new HttpPost ("// localhost: 8080 / baeldung / wiremock"); request.addHeader ("Content-Type", "application / json"); request.setEntity (entita); HttpResponse response = httpClient.execute (požiadavka);

Toto je testovací kód používaný na overenie útržku:

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

4.5. Priorita pahýľa

Predchádzajúce podsekcie sa zaoberajú situáciami, keď sa požiadavka HTTP zhoduje iba s jedným stubom. Bolo by to komplikovanejšie, ak by sa požiadavke vyhovovalo viac. V takom prípade bude mať predvolene prednosť naposledy pridaný stub. Používatelia však môžu toto správanie prispôsobiť tak, aby získali väčšiu kontrolu nad pahýľmi WireMock.

Predvedieme operácie servera WireMock, keď sa budúca požiadavka zhoduje s dvoma rôznymi stubmi, s nastavením priority aj bez nej, súčasne. Oba scenáre budú používať nasledujúcu metódu súkromného pomocníka:

private HttpResponse generateClientAndReceiveResponseForPriorityTests () vyvolá IOException {CloseableHttpClient httpClient = HttpClients.createDefault (); HttpGet request = new HttpGet ("// localhost: 8080 / baeldung / wiremock"); request.addHeader ("Prijať", "text / xml"); vrátiť httpClient.execute (požiadavka); }

Najskôr nakonfigurujte dva pahýly bez ohľadu na úroveň priority:

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

Ďalej vytvorte klienta HTTP a vykonajte požiadavku pomocou pomocnej metódy opísanej vyššie:

HttpResponse httpResponse = generateClientAndReceiveResponseForPriorityTests ();

Nasledujúci úryvok kódu overuje, či sa použije posledný nakonfigurovaný stub bez ohľadu na ten, ktorý bol definovaný predtým, keď sa žiadosť zhoduje s oboma z nich:

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

Prejdime k pahýľom s nastavenými úrovňami priority, kde nižšie číslo predstavuje vyššiu prioritu:

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

Vytvorenie a vykonanie požiadavky HTTP:

HttpResponse httpResponse = generateClientAndReceiveResponseForPriorityTests ();

Nasledujúci kód overuje účinok úrovní priority, kde sa použije prvý nakonfigurovaný stub namiesto posledných:

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

5. Záver

Tento tutoriál predstavil WireMock a spôsob nastavenia a konfigurácie tejto knižnice na testovanie rozhraní REST API pomocou rôznych techník, vrátane zhody adresy URL, hlavičiek požiadaviek a tela.

Implementáciu všetkých príkladov a útržkov kódu nájdete v projekte GitHub.


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