Testing av tilbakeringinger med Mockito

1. Oversikt

I denne korte opplæringen vil vi fokusere på hvordan du tester tilbakeringinger ved hjelp av det populære testrammeverket Mockito.

Vi vil utforske to løsninger, først bruker en ArgumentCaptor og deretter det intuitive doAnswer () metode.

For å lære mer om å teste godt med Mockito, sjekk ut Mockito-serien vår her.

2. Introduksjon til tilbakeringing

En tilbakeringing er et stykke kode som sendes som et argument til en metode, som forventes å ringe tilbake (utføre) argumentet på et gitt tidspunkt.

Denne kjøringen kan være øyeblikkelig som i en synkron tilbakeringing, men mer vanlig kan det skje på et senere tidspunkt som ved en asynkron tilbakeringing.

Et vanlig scenario for bruk av tilbakeringing er under serviceinteraksjoner når vi trenger å behandle svaret fra en serviceanrop.

I denne veiledningen bruker vi Service grensesnitt vist nedenfor som samarbeidspartner i testsaker:

offentlig grensesnittstjeneste {void doAction (strengforespørsel, tilbakeringing av tilbakeringing); }

I Ring tilbake argument vi passerer en klasse som vil håndtere svaret ved hjelp av svar (T svar) metode:

offentlig grensesnitt Callback {ugyldig svar (T-svar); } 

2.1. En enkel tjeneste

Vi bruker også en grei tjenesteeksempel for å demonstrere hvordan du bestiller og påkaller tilbakeringingen:

offentlig ugyldig doAction () {service.doAction ("vår forespørsel", ny tilbakeringing () {@ overstyr offentlig ugyldig svar (svarsvar) {handleResponse (svar);}}); } 

De handleResponse metoden sjekker for å se om svaret er gyldig før du legger til noen data i Respons gjenstand:

privat ugyldig handleResponse (svarrespons) {if (respons.isValid ()) {respons.setData (nye data ("Vellykket datasvar")); }}

For klarhetens skyld har vi valgt å ikke bruke et Java Lamda-uttrykk, men service.doActionsamtale kan også skrives mer kortfattet:

service.doAction ("vår forespørsel", svar -> handleResponse (svar)); 

For å lære mer om Lambda-uttrykk, se her.

3. Bruke en ArgumentCaptor

La oss nå se på hvordan vi bruker Mockito til å ta tak i Ring tilbake objekt ved hjelp av en ArgumentCaptor:

@Test offentlig ugyldig givenServiceWithValidResponse_whenCallbackReceived_thenProcessed () {ActionHandler handler = new ActionHandler (service); handler.doAction (); verifisere (service). doAction (anyString (), callbackCaptor.capture ()); Tilbakeringing tilbakeringing = tilbakeringingCaptor.getValue (); Svarrespons = nytt svar (); tilbakeringing. svar (svar); String expectMessage = "Vellykket datasvar"; Datadata = respons.getData (); assertEquals ("Bør motta en vellykket melding:", expectMessage, data.getMessage ()); }

I dette eksemplet oppretter vi først en ActionHandler før du ringer til doAction metoden til denne håndtereren. Dette er ganske enkelt en innpakning til vår enkle tjeneste doAction metodeanrop det er der vi påkaller tilbakeringing.

Deretter bekrefter vi det doAction ble kalt på vår mock service forekomst passerer anyString () som det første argumentet og callbackCaptor.capture () som det andre, det er der vi fanger Ring tilbake gjenstand. De getValue () metoden kan deretter brukes til å returnere den fangede verdien av argumentet.

Nå som vi har fått Ring tilbake objekt, lager vi et Respons objekt som er gyldig som standard før vi Ring svare metode direkte og hevde at responsdataene har riktig verdi.

4. Bruke doAnswer () Metode

Nå skal vi se på en vanlig løsning for stubbemetoder som har tilbakeringing bruker Mockito Svar objekt og svare metoden for å stanse tomrummetdoAction:

@Test offentlig ugyldig givenServiceWithInvalidResponse_whenCallbackReceived_thenNotProcessed () {Response response = new Response (); response.setIsValid (false); doAnswer ((Answer) invocation -> {Callback callback = invocation.getArgument (1); callback.reply (response); Data data = response.getData (); assertNull ("Ingen data i ugyldig respons:", data); return null;}). når (service) .doAction (anyString (), any (Callback.class)); ActionHandler handler = ny ActionHandler (service); handler.doAction (); } 

Og i vårt andre eksempel oppretter vi først en ugyldig Respons objekt som vil bli brukt senere i testen.

Deretter setter vi opp Svar på vår hånetjeneste slik at når doAction er kalt, vi fanger påkallingen og tar tak i metodeargumentene ved hjelp av invocation.getArgument (1) å få Ring tilbake argument.

Det siste trinnet er å lage ActionHandler og ring doAction som forårsaker Svar å bli påberopt.

For å lære mer om å stikke ugyldige metoder, se her.

3. Konklusjon

I denne korte artikkelen dekket vi to forskjellige måter å nærme oss tilbakeringing på når vi testet med Mockito.

Som alltid er eksemplene tilgjengelige i dette GitHub-prosjektet.


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