Test af tilbagekald med Mockito

1. Oversigt

I denne korte vejledning fokuserer vi på hvordan man tester tilbagekald ved hjælp af den populære testramme Mockito.

Vi undersøger to løsninger, først ved hjælp af en ArgumentCaptor og derefter det intuitive doAnswer () metode.

For at lære mere om at teste godt med Mockito, se vores Mockito-serie her.

2. Introduktion til tilbagekald

En tilbagekaldelse er et stykke kode, der sendes som et argument til en metode, som forventes at tilbagekalde (udføre) argumentet på et givet tidspunkt.

Denne udførelse kan være øjeblikkelig som ved en synkron tilbagekaldelse, men mere typisk kan det ske på et senere tidspunkt som ved en asynkron tilbagekaldelse.

Et almindeligt scenario for brug af tilbagekald er under serviceinteraktioner, når vi har brug for at behandle svaret fra et serviceopkald.

I denne vejledning bruger vi Service interface vist nedenfor som samarbejdspartner i testsager:

offentlig grænsefladetjeneste {void doAction (strenganmodning, tilbagekaldelse af tilbagekald); }

I Ring tilbage argument passerer vi en klasse, der håndterer svaret ved hjælp af svar (T svar) metode:

offentlig grænseflade Callback {ugyldigt svar (T-svar); } 

2.1. En enkel service

Vi bruger også en ligetil serviceeksempel for at demonstrere, hvordan man videresender og påberåber tilbagekaldet:

offentlig ugyldig doAction () {service.doAction ("vores-anmodning", nyt tilbagekald () {@ Override offentligt ugyldigt svar (svarsvar) {handleResponse (svar);}}); } 

Det handleResponse metode kontrollerer, om svaret er gyldigt, før der tilføjes nogle data til Respons objekt:

private ugyldige handleResponse (svarrespons) {if (respons.isValid ()) {respons.setData (nye data ("Datarespons er vellykket")); }}

For klarhedens skyld har vi valgt ikke at bruge et Java Lamda-udtryk, men service.doActionopkald kunne også skrives mere kortfattet:

service.doAction ("vores-anmodning", svar -> handleResponse (svar)); 

For at lære mere om Lambda-udtryk, se her.

3. Brug af en ArgumentCaptor

Lad os nu se på hvordan vi bruger Mockito til at få fat i Ring tilbage objekt ved hjælp af en ArgumentCaptor:

@Test offentlig ugyldighed givenServiceWithValidResponse_whenCallbackReceived_thenProcessed () {ActionHandler handler = ny ActionHandler (service); handler.doAction (); verificere (service). doAction (anyString (), callbackCaptor.capture ()); Callback callback = callbackCaptor.getValue (); Svarrespons = nyt svar (); tilbagekald.svar (svar); String expectMessage = "Succesfuld datasvar"; Datadata = respons.getData (); assertEquals ("Skal modtage en vellykket besked:", expectMessage, data.getMessage ()); }

I dette eksempel opretter vi først en ActionHandler inden du ringer til doAction metode til denne handler. Dette er simpelthen en indpakning til vores Simple Service doAction metodeopkald hvor vi påkalder vores tilbagekald.

Dernæst bekræfter vi det doAction blev kaldt på vores mock service instans passerer anyString () som det første argument og callbackCaptor.capture () som det andet, hvor vi indfanger Ring tilbage objekt. Det getValue () Metoden kan derefter bruges til at returnere den fangede værdi af argumentet.

Nu hvor vi har Ring tilbage objekt skaber vi en Respons objekt, der er gyldigt som standard, før vi ring til svar metode direkte og hævde, at svardataene har den korrekte værdi.

4. Brug af doAnswer () Metode

Nu ser vi på en fælles løsning til stubbemetoder, der har tilbagekald ved hjælp af Mockito's Svar objekt og besvar metode til at stoppe ugyldighedsmetodendoAction:

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

Og i vores andet eksempel opretter vi først en ugyldig Respons objekt, der vil blive brugt senere i testen.

Derefter opretter vi Svar på vores mock-service, så når doAction Hedder, vi opfanger påkaldelsen og griber metodeargumenterne ved hjælp af invocation.getArgument (1) at få Ring tilbage argument.

Det sidste trin er at oprette ActionHandler og ring doAction som forårsager Svar at påberåbes.

Se her for at lære mere om stubning af ugyldige metoder.

3. Konklusion

I denne korte artikel dækkede vi to forskellige måder at nærme sig test-callbacks på, når vi testede med Mockito.

Som altid er eksemplerne tilgængelige i dette GitHub-projekt.


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