Visszahívások tesztelése Mockitóval

1. Áttekintés

Ebben a rövid bemutatóban a következőkre fogunk összpontosítani hogyan kell tesztelni a visszahívásokat a népszerű Mockito tesztelési keretrendszer használatával.

Két megoldást fogunk felfedezni, először is egy ArgumentCaptor majd az intuitív doAnswer () módszer.

Ha többet szeretne megtudni a Mockito jó teszteléséről, tekintse meg itt a Mockito sorozatunkat.

2. Bevezetés a visszahívásokba

A visszahívás olyan kódrészlet, amelyet argumentumként továbbítanak egy metódushoz, és amely várhatóan visszahívja (végrehajtja) az argumentumot egy adott időpontban.

Ez a végrehajtás lehet azonnali, mint egy szinkron visszahívásnál, de tipikusabban később, mint aszinkron visszahívás esetén.

A visszahívások használatának általános forgatókönyve az szolgáltatás interakciók során, amikor egy szervizhívás válaszát kell feldolgoznunk.

Ebben az oktatóanyagban a Szolgáltatás az alábbiakban együttműködési partnerként látható felület teszt esetekben:

nyilvános felület szolgáltatás {void doAction (karakterlánc kérés, visszahívás visszahívás); }

Ban,-ben Visszahív argumentumon átadunk egy osztályt, amely a választ a válasz (T válasz) módszer:

nyilvános felület Visszahívás {érvénytelen válasz (T válasz); } 

2.1. Egyszerű szolgáltatás

Mi is egyeneset fogunk használni szolgáltatási példa a visszahívás átadásának és meghívásának bemutatására:

public void doAction () {service.doAction ("kérésünk", új Visszahívás () {@Orride public void response (Response response) {handleResponse (response);}}); } 

A handleResponse metódus ellenőrzi, hogy a válasz érvényes-e, mielőtt néhány adatot hozzáadna a Válasz tárgy:

private void handleResponse (Response response) {if (response.isValid ()) {response.setData (új adat ("Sikeres adatválasz")); }}

Az egyértelműség kedvéért úgy döntöttünk, hogy nem a Java Lamda kifejezést használjuk, hanem a service.doActionfelhívást is lehetne tömörebben írni:

service.doAction ("kérésünk", válasz -> handleResponse (válasz)); 

Ha többet szeretne megtudni a Lambda kifejezésekről, tekintse meg itt.

3. A ArgumentCaptor

Most nézzük meg hogyan használjuk a Mockitót a Visszahív objektumot egy ArgumentCaptor:

@Test public void givenServiceWithValidResponse_whenCallbackReceived_thenProcessed () {ActionHandler handler = new ActionHandler (service); handler.doAction (); verify (service) .doAction (anyString (), callbackCaptor.capture ()); Visszahívás visszahívás = callbackCaptor.getValue (); Válaszválasz = új Válasz (); visszahívás.válasz (válasz); String várhatóMessage = "Sikeres adatválasz"; Adat adatok = response.getData (); assertEquals ("Sikeres üzenetet kell kapnia:", várhatóMessage, data.getMessage ()); }

Ebben a példában először létrehozunk egy ActionHandler mielőtt felhívná a doAction ennek a kezelőnek a módszere. Ez egyszerűen burkoló az egyszerű szolgáltatásunkhoz doAction módszer hívása ahol hívjuk a visszahívásunkat.

Ezután ellenőrizzük doAction felhívták az álszolgáltatási példányunk elhaladásán anyString () első érvként és callbackCaptor.capture () másodikként, ahol megragadjuk a Visszahív tárgy. A getValue () metódus ezután visszaadható az argumentum rögzített értéke.

Most, hogy megvan a Visszahív objektumot, létrehozunk egy Válasz objektum, amely alapértelmezés szerint érvényes előttünk hívja a válasz módszerrel, és állítsa be, hogy a válaszadatok helyes értékkel rendelkeznek.

4. A doAnswer () Módszer

Most megnézzük a gyakori megoldás a visszahívással rendelkező módszerekre a Mockito-t használva Válasz tárgy és doAnswer módszer a void módszer elcsúfításáhozdoAction:

@Test public void givenServiceWithInvalidResponse_whenCallbackReceived_thenNotProcessed () {Response response = new Response (); response.setIsValid (hamis); doAnswer ((Answer) meghívás -> {Callback callback = invocation.getArgument (1); callback.reply (válasz); Data data = response.getData (); assertNull ("Nincs érvénytelen válaszban adat:", data); return null;}). when (service) .doAction (anyString (), any (Callback.class)); ActionHandler kezelő = new ActionHandler (szolgáltatás); handler.doAction (); } 

A második példánkban először egy érvénytelenet hozunk létre Válasz objektum, amelyet később használunk a teszt során.

Ezután beállítottuk a Válasz álszolgálatunkon, hogy mikor doAction nak, nek hívják, elfogjuk az invokációt és megragadjuk a metódus argumentumokat a segítségével invocation.getArgument (1) hogy megkapja a Visszahív érv.

Az utolsó lépés a ActionHandler és hívjon doAction ami okozza a Válasz hogy hívják.

Ha többet szeretne megtudni a semmissé vált módszerekről, tekintse meg itt.

3. Következtetés

Ebben a rövid cikkben két különböző módszert ismertettünk a visszahívások tesztelésének megközelítésében a Mockitóval történő tesztelés során.

Mint mindig, a példák is elérhetők ebben a GitHub projektben.