Korištenje Mockito ArgumentCaptor

1. Pregled

U ovom ćemo uputstvu pokriti uobičajeni slučaj upotrebe Mockita ArgumentCaptor u našim jediničnim testovima.

Alternativno, za druge Mockito.verify slučajevi upotrebe, pogledajte našu Mockito Verify Cookbook.

2. Korištenje ArgumentCaptor

ArgumentCaptor omogućuje nam hvatanje argumenta prosljeđenog metodi kako bismo je pregledali. Ovaj je posebno korisno kada ne možemo pristupiti argumentu izvan metode koju želimo testirati.

Na primjer, razmotrite EmailService razred s a poslati metodu koju bismo željeli testirati:

javna klasa EmailService {privatna platforma DeliveryPlatform; javna usluga e-pošte (platforma DeliveryPlatform) {this.platform = platforma; } public void send (String to, String subject, String body, boolean html) {Format format = Format.TEXT_ONLY; if (html) {format = Format.HTML; } E-adresa e-pošte = nova e-pošta (na, temu, tijelo); email.setFormat (format); platform.deliver (e-pošta); } ...}

U EmailService.poslati, primijetite kako platforma.dostavljač uzima novi E-mail kao argument. Kao dio našeg testa željeli bismo provjeriti je li polje za format novog E-mail postavljeno je na Format.HTML. Da bismo to učinili, moramo uhvatiti i pregledati argument kojem se prosljeđuje platforma.dostavljač.

Pogledajmo kako se možemo koristiti ArgumentCaptor da nam pomogne.

2.1. Postavljanje jediničnog testa

Prvo, kreirajmo našu klasu jediničnog testa:

@RunWith (MockitoJUnitRunner.class) javna klasa EmailServiceUnitTest {@Mock DeliveryPlatform platforma; @InjectMocks EmailService emailService; ...}

Koristimo @Oponašanje napomena za ruganje Platforma isporuke, koji se automatski ubrizgava u naš EmailService s @InjectMocks bilješka. Dodatne pojedinosti potražite u našem članku Mockito Annotations.

2.2. Dodajte znak ArgumentCaptor Polje

Kao drugo, dodajmo novo ArgumentCaptor polje tipa E-mail pohraniti naš zarobljeni argument:

@Captor ArgumentCaptor emailCaptor;

2.3. Snimite argument

Treće, poslužimo se Mockito.verify s ArgumentCaptor uhvatiti E-mail:

Mockito.verify (platforma) .deliver (emailCaptor.capture ());

Tada možemo dobiti snimljenu vrijednost i pohraniti je kao novu E-mail objekt:

E-pošta emailCaptorValue = emailCaptor.getValue ();

2.4. Pregledajte zarobljenu vrijednost

Na kraju, pogledajmo cijeli test s tvrdnjom da se pregleda zarobljeni E-mail objekt:

@Test javna void whenDoesSupportHtml_expectHTMLEmailFormat () {String to = "[email protected]"; Niz predmeta = "Korištenje ArgumentCaptor"; String body = "Hej, iskoristimo ArgumentCaptor"; emailService.send (to, subject, body, true); Mockito.verify (platforma) .deliver (emailCaptor.capture ()); Vrijednost e-pošte = emailCaptor.getValue (); assertEquals (Format.HTML, value.getFormat ()); }

3. Izbjegavanje bušenja

Iako možemo koristiti ArgumentCaptor s krnjem, općenito bismo to trebali izbjegavati. Da pojasnimo, u Mockitu to općenito znači izbjegavanje upotrebe ArgumentCaptor s Mockito.kad. S klatnjem bismo trebali koristiti ArgumentMatcher umjesto toga.

Pogledajmo nekoliko razloga zašto bismo trebali izbjegavati zapinjanje.

3.1. Smanjena čitljivost testa

Prvo razmotrite jednostavan test:

Vjerodajnice za vjerodajnice = nove vjerodajnice ("baeldung", "correct_password", "correct_key"); Mockito.when (platform.authenticate (Mockito.eq (vjerodajnice))). ThenReturn (AuthenticationStatus.AUTHENTICATED); assertTrue (emailService.authenticatedSuccessfully (vjerodajnice));

Evo, koristimo Mockito.eq (vjerodajnice) kako bi odredio kada bi lažni obrazac trebao vratiti objekt.

Dalje, razmotrite isti test koristeći ArgumentCaptor umjesto toga:

Vjerodajnice za vjerodajnice = nove vjerodajnice ("baeldung", "correct_password", "correct_key"); Mockito.when (platform.authenticate (credentialsCaptor.capture ())). ThenReturn (AuthenticationStatus.AUTHENTICATED); assertTrue (emailService.authenticatedSuccessfully (vjerodajnice)); assertEquals (vjerodajnice, vjerodajniceCaptor.getValue ());

Za razliku od prvog testa, primijetite kako moramo izvesti dodatnu tvrdnju na zadnjem retku da bismo učinili isto kao Mockito.eq (vjerodajnice).

Napokon, primijetite kako nije odmah jasno što credentialsCaptor.capture () odnosi se na. To je zato što moramo stvoriti otmičar izvan linije na kojoj ga koristimo, što smanjuje čitljivost.

3.2. Smanjen nedostatak Lokalizacija

Drugi je razlog taj što ako emailService.authenticatedUspješno ne zove platforma.autentifikacija, dobit ćemo iznimku:

org.mockito.exceptions.base.MockitoException: Nije zabilježena vrijednost argumenta!

To je zato što naša stub metoda nije zabilježila argument. Međutim, stvarni problem nije u samom našem testu, već u stvarnoj metodi koju testiramo.

Drugim riječima, pogrešno nas usmjerava na iznimku u testu, dok je stvarni nedostatak u metodi koju testiramo.

4. Zaključak

U ovom kratkom vodiču pogledali smo općeniti slučaj korištenja ArgumentCaptor. Također smo pogledali razloge izbjegavanja upotrebe ArgumentCaptor s krnjem. Kao i obično, svi naši uzorci koda dostupni su na GitHubu.