A Mockito ArgumentCaptor használata

1. Áttekintés

Ebben az oktatóanyagban a Mockito használatának egy általános használatával foglalkozunk ArgumentCaptor egység tesztjeinken.

Alternatívaként más Mockito.ellenőrizze használati esetekről olvassa el a Mockito Verify Cookbook-ot.

2. Használata ArgumentCaptor

ArgumentCaptor lehetővé teszi számunkra, hogy rögzítsünk egy metódusnak átadott argumentumot annak megvizsgálása érdekében. Ez Különösen akkor hasznos, ha nem érhetjük el az argumentumot a tesztelni kívánt módszeren kívül.

Vegyünk például egy EmailService osztály a Küld tesztelni kívánt módszer:

public class EmailService {private DeliveryPlatform platform; public EmailService (DeliveryPlatform platform) {this.platform = platform; } public void send (String ide, String tárgy, String törzs, logikai html) {Formátum formátum = Formátum.TEXT_ONLY; if (html) {format = Formátum.HTML; } Email email = új Email (címzettnek, tárgynak, törzsnek); email.setFormat (formátum); platform.deliver (e-mail); } ...}

Ban ben EmailService.Küld, vegye észre, hogyan platform.szállít vesz egy újat Email érvként. Tesztünk részeként szeretnénk ellenőrizni, hogy az új formátummezője van-e Email értékre van állítva Formátum.HTML. Ehhez meg kell ragadnunk és ellenőriznünk kell az átadott érvet platform.szállít.

Lássuk, hogyan tudjuk használni ArgumentCaptor hogy segítsen nekünk.

2.1. Állítsa be az egység tesztjét

Először hozzuk létre az egység teszt osztályunkat:

@RunWith (MockitoJUnitRunner.class) public class EmailServiceUnitTest {@Mock DeliveryPlatform platform; @InjectMocks EmailService emailService; ...}

Használjuk a @Mock annotáció gúnyolódni DeliveryPlatform, amelyet automatikusan beinjekcióznak a mi EmailService a ... val @InjectMocks annotáció. További részletekért olvassa el a Mockito Annotations cikkünket.

2.2. Adjon hozzá egy ArgumentCaptor Terület

Másodszor adjunk hozzá egy újat ArgumentCaptor típusú mező Email hogy rögzítsük elfogott érvünket:

@Captor ArgumentCaptor emailCaptor;

2.3. Ragadja meg az érvet

Harmadszor, használjuk Mockito.ellenőrizze a ... val ArgumentCaptor hogy megörökítse a Email:

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

Ezután megszerezhetjük a rögzített értéket, és újként tárolhatjuk Email tárgy:

Email emailCaptorValue = emailCaptor.getValue ();

2.4. Ellenőrizze a rögzített értéket

Végül nézzük meg az egész tesztet egy állítással, hogy megvizsgáljuk a befogottakat Email tárgy:

@Test public void whenDoesSupportHtml_expectHTMLEmailFormat () {String to = "[email protected]"; Karaktersorozat = "ArgumentCaptor használata"; Karaktersorozat = "Hé, használjuk az ArgumentCaptor" -t; emailService.send (to, subject, body, true); Mockito.verify (platform) .deliver (emailCaptor.capture ()); E-mail értéke = emailCaptor.getValue (); assertEquals (Formátum.HTML, value.getFormat ()); }

3. Kerülje a szúrást

Habár használhatunk egy ArgumentCaptor csökönyösséggel, általában kerülnünk kell ezt. Tisztázandó, hogy a Mockito-ban ez általában azt jelenti, hogy kerüljük az ArgumentCaptor val vel Mockito.mikor. A csöppségnél használnunk kell egy ArgumentMatcher helyette.

Nézzünk meg néhány okot, amelyek miatt kerülnünk kell a botrányt.

3.1. Csökkent teszt-olvashatóság

Először is vegyen fontolóra egy egyszerű tesztet:

Hitelesítő adatok hitelesítő adatai = új hitelesítő adatok ("baeldung", "helyes_jelszó", "helyes_kulcs"); Mockito.when (platform.authenticate (Mockito.eq (hitelesítő adatok))) .thenReturn (AuthenticationStatus.AUTHENTICATED); assertTrue (emailService.authenticatedSuccessfully (hitelesítő adatok));

Itt használjuk Mockito.eq (hitelesítő adatok) annak meghatározása, hogy az álnak mikor kell visszaadnia egy objektumot.

Ezután fontolja meg ugyanazt a tesztet egy ArgumentCaptor helyette:

Hitelesítő adatok hitelesítő adatai = új hitelesítő adatok ("baeldung", "helyes_jelszó", "helyes_kulcs"); Mockito.when (platform.authenticate (credentialsCaptor.capture ())) .thenReturn (AuthenticationStatus.AUTHENTICATED); assertTrue (emailService.authenticatedSuccessfully (hitelesítő adatok)); assertEquals (hitelesítő adatok, credentialsCaptor.getValue ());

Az első teszttel ellentétben vegye észre, hogyan kell az utolsó sorban extra állítást végrehajtanunk ahhoz, hogy ugyanezt tegyük Mockito.eq (hitelesítő adatok).

Végül vegye észre, hogy nem azonnal világos, mit credentialsCaptor.capture () utal rá. Ennek oka, hogy a fogvatartót azon a vonalon kívül kell létrehoznunk, amelyen használjuk, ami csökkenti az olvashatóságot.

3.2. Csökkentett hiba Lokalizálás

Egy másik ok az, hogy ha emailService.authenticatedSuccess nem hív platform.igazolja, kivételt fogunk kapni:

org.mockito.exceptions.base.MockitoException: Nem rögzítettünk argumentumértéket!

Ennek oka, hogy a megrekedt módszerünk nem ragadott el érvet. A tényleges probléma azonban nem magában a tesztünkben van, hanem a tényleges módszerben, amelyet tesztelünk.

Más szavakkal, tévesen egy kivételhez irányít minket a teszt során, míg a tényleges hiba abban a módszerben van, amelyet tesztelünk.

4. Következtetés

Ebben a rövid bemutatóban a használat általános használatának esetét vizsgáltuk meg ArgumentCaptor. Megvizsgáltuk a használat elkerülésének okait is ArgumentCaptor csökönyösséggel. Szokás szerint az összes kódmintánk elérhető a GitHubon.