Testiranje povratnih poziva s Mockitom

1. Pregled

U ovom kratkom vodiču usredotočit ćemo se na kako testirati povratne pozive koristeći popularni testni okvir Mockito.

Istražit ćemo dva rješenja, prvo pomoću ArgumentCaptor a zatim intuitivno doAnswer () metoda.

Da biste saznali više o dobrom testiranju s Mockitom, ovdje pogledajte našu Mockito seriju.

2. Uvod u povratne pozive

Povratni poziv je dio koda koji se prosljeđuje kao argument metodi, za koju se očekuje da u određenom trenutku pozove (izvrši) argument.

Ovo izvršavanje može biti trenutno kao u sinkronom povratnom pozivu, ali tipičnije može se dogoditi kasnije kao u asinkronom povratnom pozivu.

Uobičajeni scenarij korištenja povratnih poziva je tijekom interakcije s uslugom kada trebamo obraditi odgovor sa poziva usluge.

U ovom uputstvu koristit ćemo Servis sučelje prikazano u nastavku kao suradnik u testnim slučajevima:

usluga javnog sučelja {void doAction (zahtjev za nizom, povratni poziv); }

U Uzvratiti poziv argument prosljeđujemo klasu koja će obrađivati ​​odgovor pomoću odgovor (T odgovor) metoda:

Javno sučelje Povratni poziv {nevažeći odgovor (T odgovor); } 

2.1. Jednostavna usluga

Također ćemo upotrijebiti izravno primjer usluge za demonstraciju prosljeđivanja i pozivanja povratnog poziva:

javna nevažeća doAction () {service.doAction ("naš zahtjev", novi povratni poziv () {@ Naruči javni void odgovor (odgovor na odgovor) {handleResponse (odgovor);}}); } 

The handleResponse metoda provjerava je li odgovor valjan prije dodavanja nekih podataka u Odgovor objekt:

private void handleResponse (Response response) {if (response.isValid ()) {response.setData (novi podaci ("Uspješan odgovor podataka")); }}

Radi jasnoće odlučili smo se ne koristiti izraz Java Lamda, već izraz usluga.djelovanjepoziv također može biti sažetiji:

service.doAction ("naš zahtjev", odgovor -> handleResponse (odgovor)); 

Da biste saznali više o Lambda izrazima, pogledajte ovdje.

3. Korištenjem ArgumentCaptor

Sada pogledajmo kako koristimo Mockito da zgrabimo Uzvratiti poziv objekt pomoću ArgumentCaptor:

@Test javna praznina givenServiceWithValidResponse_whenCallbackReceived_thenProcessed () {Rukovatelj ActionHandler = novi ActionHandler (usluga); handler.doAction (); verify (service) .doAction (anyString (), callbackCaptor.capture ()); Povratni poziv povratni poziv = callbackCaptor.getValue (); Odgovor odgovora = novi odgovor (); callback.reply (odgovor); String očekujeMessage = "Uspješan odgovor podataka"; Podaci podataka = response.getData (); assertEquals ("Trebao bi primiti uspješnu poruku:", očekuje seMessage, data.getMessage ()); }

U ovom primjeru prvo stvaramo ActionHandler prije nego što pozove doAction metoda ovog rukovatelja. Ovo je jednostavno omot naše jednostavne usluge doAction poziv metode zbog čega pozivamo svoj povratni poziv.

Dalje, to provjeravamo doAction je pozvan u prolazu naše lažne instance usluge anyString () kao prvi argument i callbackCaptor.capture () kao drugi, na kojem hvatamo Uzvratiti poziv objekt. The getValue () Tada se metoda može koristiti za vraćanje zarobljene vrijednosti argumenta.

Sad kad smo dobili Uzvratiti poziv objekt, mi stvaramo Odgovor objekt koji vrijedi prema zadanim postavkama prije nego mi nazovite odgovor metodu izravno i ustvrdite da podaci odgovora imaju točnu vrijednost.

4. Korištenje doAnswer () Metoda

Sada ćemo pogledati a uobičajeno rješenje za metode pricanja koje imaju povratne pozive pomoću Mockitove Odgovor objekt i doAnswer metoda za ublažavanje metode prazninedoAction:

@Test javna praznina givenServiceWithInvalidResponse_whenCallbackReceived_thenNotProcessed () {Odgovor odgovora = novi odgovor (); response.setIsValid (false); doAnswer ((Answer) invocation -> {Callback callback = invocation.getArgument (1); callback.reply (response); Data data = response.getData (); assertNull ("Nema podataka u neispravnom odgovoru:", podaci); return null;}). when (service) .doAction (anyString (), any (Callback.class)); ActionHandler rukovatelj = novi ActionHandler (usluga); handler.doAction (); } 

I, u našem drugom primjeru, prvo stvaramo nevaljano Odgovor objekt koji će se koristiti kasnije u testu.

Dalje, postavili smo Odgovor na našem lažnom servisu, tako da kad doAction Zove se, presrećemo poziv i hvatamo argumente metode pomoću invocation.getArgument (1) da biste dobili Uzvratiti poziv argument.

Posljednji korak je stvaranje ActionHandler i nazovite doAction što uzrokuje Odgovor na koje se treba pozivati.

Da biste saznali više o metodama zatvaranja praznina, pogledajte ovdje.

3. Zaključak

U ovom smo kratkom članku pokrili dva različita načina pristupanja testiranju povratnih poziva prilikom testiranja s Mockitom.

Kao i uvijek, primjeri su dostupni u ovom GitHub projektu.


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