A WireMock bemutatása

1. Áttekintés

WireMock egy könyvtár a webszolgáltatások megcsalására és gúnyolására. Felépít egy HTTP kiszolgálót, amelyhez ugyanúgy kapcsolódhatunk, mint egy tényleges webszolgáltatáshoz.

Amikor egy WireMock szerver működik, beállíthatjuk az elvárásokat, felhívhatjuk a szolgáltatást, majd ellenőrizhetjük annak viselkedését.

2. Maven-függőségek

A WireMock könyvtár előnyeinek kihasználásához a következő függőséget kell beépítenünk a POM-ba:

 com.github.tomakehurst wiremock 1.58 teszt 

3. Programozottan kezelt szerver

Ez a szakasz a WireMock szerver kézi konfigurálásának módját ismerteti. azaz a JUnit automatikus konfigurációjának támogatása nélkül. A felhasználást egy nagyon egyszerű csonk bizonyítja.

3.1. Szerver beállítása

A WireMock szerver így példányosítható:

WireMockServer wireMockServer = új WireMockServer (String gazdagép, int port);

Ha nincs megadva argumentum, akkor a kiszolgáló állomás alapértelmezett értéke helyi kiszolgáló és a kiszolgáló portja 8080.

Ezután a kiszolgálót két egyszerű módszerrel lehet elindítani és leállítani:

wireMockServer.start ();

És:

wireMockServer.stop ();

3.2. Alapvető használat

A WireMock könyvtárat először egy alapvető használat fogja bemutatni, ahol egy pontos URL-hez külön konfiguráció nélküli csonk van megadva. Hozzunk létre egy kiszolgálópéldányt:

WireMockServer wireMockServer = új WireMockServer ();

A WireMock szervernek futnia kell, mielőtt az ügyfél csatlakozik hozzá:

wireMockServer.start ();

Ezután a webszolgáltatás elakad:

configureFor ("localhost", 8080); stubFor (get (urlEqualTo ("/ baeldung")).. willReturn (aResponse (). withBody ("Üdvözöljük a Baeldungban!")));

Ez az oktatóanyag az Apache HttpClient API-t használja a kiszolgálóhoz csatlakozó kliens ábrázolásához:

CloseableHttpClient httpClient = HttpClients.createDefault ();

Egy kérés végrehajtásra kerül, és a válasz visszajön, illetve:

HttpGet request = new HttpGet ("// localhost: 8080 / baeldung"); HttpResponse httpResponse = httpClient.execute (kérés);

Átváltjuk a httpResponse változó a Húr segítő módszerrel:

String responseString = convertResponseToString (httpResponse);

A konverziós segítő módszer megvalósítása itt található:

privát karakterlánc convertResponseToString (HttpResponse response) dobja az IOException {InputStream responseStream = response.getEntity (). getContent (); Szkenner szkenner = új szkenner (responseStream, "UTF-8"); String responseString = szkenner.useDelimiter ("\ Z"). Következő (); scanner.close (); return responseString; }

A következő kód ellenőrzi, hogy a kiszolgáló kapott-e kérést a várt URL-re, és hogy az ügyfélhez érkező válasz pontosan mit küldött:

ellenőrizze (getRequestedFor (urlEqualTo ("/ baeldung"))); assertEquals ("Üdvözöljük a Baeldungban!", stringResponse);

Végül le kell állítani a WireMock szervert a rendszererőforrások felszabadítása érdekében:

wireMockServer.stop ();

4. JUnit kezelt kiszolgáló

A 3. szakasztól eltérően ez a szakasz a WireMock szerver használatát mutatja be a JUnit segítségével Szabály.

4.1. Szerver beállítása

A WireMock szerver integrálható a JUnit tesztesetekbe a @Szabály annotáció. Ez lehetővé teszi a JUnit számára az életciklus kezelését, a szerver indítását az egyes vizsgálati módszerek előtt, és a metódus visszatérése után leállítást.

A programozottan felügyelt kiszolgálóhoz hasonlóan a JUnit által felügyelt WireMock szerver Java objektumként létrehozható a megadott portszámmal:

@Rule public WireMockRule wireMockRule = új WireMockRule (int port);

Ha nem adunk meg argumentumokat, akkor a kiszolgáló portja az alapértelmezett értéket veszi fel, 8080. Szerver gazdagép, alapértelmezés szerint helyi kiszolgáló, és más konfigurációk megadhatók a Opciók felület.

4.2. URL egyezés

Beállítása után a WireMockRule Például a következő lépés egy csonk konfigurálása. Ebben az alszakaszban egy REST csonkot adunk meg egy szolgáltatás végpontjának a reguláris kifejezés használatával:

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

Térjünk át egy HTTP kliens létrehozására, egy kérés végrehajtására és válaszra:

CloseableHttpClient httpClient = HttpClients.createDefault (); HttpGet request = new HttpGet ("// localhost: 8080 / baeldung / wiremock"); HttpResponse httpResponse = httpClient.execute (kérés); String stringResponse = convertHttpResponseToString (httpResponse);

A fenti kódrészlet kihasználja a konverziós segítő módszer előnyeit:

privát karakterlánc convertHttpResponseToString (HttpResponse httpResponse) dobja az IOException {InputStream inputStream = httpResponse.getEntity (). getContent (); return convertInputStreamToString (inputStream); }

Ez viszont egy másik privát módszert alkalmaz:

privát karakterlánc convertInputStreamToString (InputStream inputStream) {Szkenner szkenner = új Szkenner (inputStream, "UTF-8"); Karaktersorozat = scanner.useDelimiter ("\ Z"). Következő (); scanner.close (); return string; }

A csonk működését az alábbi tesztkód ellenőrzi:

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

4.3. Fejlécegyeztetés kérése

Most bemutatjuk, hogyan lehet egy REST API-t elcsavarni a fejlécek egyezésével. Kezdjük a csonk konfigurációval:

stubFor (get (urlPathEqualTo ("/ baeldung / wiremock")) .withHeader ("Accept", egyező ("text /.*")) .willReturn (aResponse () .withStatus (503) .withHeader ("Content-Type") , "text / html") .withBody ("!!! A szolgáltatás nem érhető el !!!")));

Az előző alszakaszhoz hasonlóan a HTTP-interakciókat a HttpClient API segítségével szemléltetjük ugyanazon segítő módszerek segítségével:

CloseableHttpClient httpClient = HttpClients.createDefault (); HttpGet request = new HttpGet ("// localhost: 8080 / baeldung / wiremock"); request.addHeader ("Elfogadás", "text / html"); HttpResponse httpResponse = httpClient.execute (kérés); String stringResponse = convertHttpResponseToString (httpResponse);

A következő ellenőrzés és állítások megerősítik a korábban létrehozott csonk funkcióit:

ellenőrizze (getRequestedFor (urlEqualTo ("/ baeldung / wiremock"))); assertEquals (503, httpResponse.getStatusLine (). getStatusCode ()); assertEquals ("text / html", httpResponse.getFirstHeader ("Content-Type"). getValue ()); assertEquals ("!!! A szolgáltatás nem érhető el !!!", stringResponse);

4.4. Testegyeztetés kérése

A WireMock könyvtár segítségével testreszabható REST API is megdermedhet. Itt található egy ilyen csonk konfigurációja:

stubFor (post (urlEqualTo ("/ baeldung / wiremock")) .withHeader ("Content-Type", equalTo ("application / json")) .withRequestBody (amely ("\" testing-library \ ": \" WireMock \ "")) .withRequestBody (amely tartalmazza ("\" creator \ ": \" Tom Akehurst \ "")) .withRequestBody (tartalmazza ("\" website \ ": \" wiremock.org \ "")) .willReturn ( aResponse () .Status (200)));

Itt az ideje létrehozni a StringEntity a kérelem törzseként használt objektum:

InputStream jsonInputStream = this.getClass (). GetClassLoader (). GetResourceAsStream ("wiremock_intro.json"); Karakterlánc jsonString = convertInputStreamToString (jsonInputStream); StringEntity entitás = new StringEntity (jsonString);

A fenti kód a korábban definiált konverziós segítő módszerek egyikét használja, convertInputStreamToString.

Itt található a wiremock_intro.json fájl az osztályúton:

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

A HTTP kéréseket és válaszokat a következőképpen lehet konfigurálni és végrehajtani:

CloseableHttpClient httpClient = HttpClients.createDefault (); HttpPost request = new HttpPost ("// localhost: 8080 / baeldung / wiremock"); request.addHeader ("Tartalom-típus", "alkalmazás / json"); request.setEntity (entitás); HttpResponse response = httpClient.execute (kérés);

Ez a tesztkód a csonk érvényesítéséhez:

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

4.5. Csonkprioritás

Az előző alfejezetek olyan helyzetekkel foglalkoznak, amikor a HTTP-kérés csak egy csonknak felel meg. Bonyolultabb lenne, ha egy kérésnél több is van, mint egyezés. Alapértelmezés szerint a legutóbb hozzáadott csonk élvez elsőbbséget ilyen esetben. A felhasználók azonban testreszabhatják ezt a viselkedést, hogy jobban ellenőrizzék a WireMock csonkjait.

Bemutatjuk a WireMock szerver működését, amikor egy érkező kérés egyidejűleg két különböző csonkhoz illeszkedik, prioritási szint beállításával és anélkül. Mindkét forgatókönyv a következő magánsegítő módszert használja:

privát HttpResponse generatorClientAndReceiveResponseForPriorityTests () dobja az IOException {CloseableHttpClient httpClient = HttpClients.createDefault (); HttpGet request = new HttpGet ("// localhost: 8080 / baeldung / wiremock"); request.addHeader ("Elfogadás", "text / xml"); return httpClient.execute (kérés); }

Először konfiguráljon két csonkot a prioritási szint figyelembevétele nélkül:

stubFor (get (urlPathMatching ("/ baeldung /.*")) .willReturn (aResponse () .WithStatus (200))); stubFor (get (urlPathEqualTo ("/ baeldung / wiremock")) .withHeader ("Elfogadás", egyezés ("szöveg /.*")) .willReturn (aResponse () .WithStatus (503)));

Ezután hozzon létre egy HTTP klienst, és hajtson végre egy kérést a fent leírt segítő módszerrel:

HttpResponse httpResponse = generálClientAndReceiveResponseForPriorityTests ();

A következő kódrészlet ellenőrzi, hogy az utoljára konfigurált csonk alkalmazva van-e, függetlenül attól, hogy korábban definiálták-e, amikor egy kérés megfelel mindkettőjüknek:

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

Térjünk át a prioritási szintek beállítására szolgáló csonkokra, ahol az alacsonyabb szám magasabb prioritást jelent:

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

HTTP-kérelem létrehozása és végrehajtása:

HttpResponse httpResponse = generálClientAndReceiveResponseForPriorityTests ();

A következő kód érvényesíti a prioritási szintek hatását, ahol az első konfigurált csonkot alkalmazzák az utolsó helyett:

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

5. Következtetés

Ez az oktatóanyag bemutatta a WireMock programot, valamint a könyvtár beállítását és konfigurálását a REST API-k teszteléséhez különféle technikák alkalmazásával, beleértve az URL, a kérés fejlécének és a törzsnek az egyeztetését.

Az összes példa és kódrészlet megvalósítása megtalálható egy GitHub projektben.