Používanie Mockito ArgumentCaptor

1. Prehľad

V tomto výučbe sa budeme venovať bežným prípadom použitia aplikácie Mockito ArgumentCaptor v našich jednotkových testoch.

Prípadne za iné Mockito.over prípady použitia, pozrite si našu kuchársku knihu Mockito Verify.

2. Pomocou ArgumentCaptor

ArgumentCaptor umožňuje zachytiť argument odovzdaný metóde, aby sme ju mohli skontrolovať. Toto je obzvlášť užitočné, keď nemáme prístup k argumentu mimo metódy, ktorú by sme chceli otestovať.

Zvážte napríklad EmailService trieda s a poslať metóda, ktorú by sme chceli vyskúšať:

verejná trieda EmailService {súkromná platforma DeliveryPlatform; verejná EmailService (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-mail e-mail = nový e-mail (komu, subjektu, orgánu); email.setFormat (formát); platform.deliver (e-mail); } ...}

V EmailService.poslať, všimnite si ako platforma. dodať berie nový Email ako argument. V rámci nášho testu by sme chceli skontrolovať, či je pole formátu nového Email je nastavený na Format.HTML. Aby sme to dosiahli, musíme zachytiť a skontrolovať argument, ktorý je odovzdaný platforma. dodať.

Pozrime sa, ako môžeme využiť ArgumentCaptor aby nám pomohli.

2.1. Nastavte test jednotky

Najprv si vytvorme našu triedu testovania jednotiek:

@RunWith (MockitoJUnitRunner.class) verejná trieda EmailServiceUnitTest {@Mock DeliveryPlatform platforma; @InjectMocks EmailService emailService; ...}

Používame @Mock anotácia na posmech Dodávacia platforma, ktorý sa automaticky vstrekuje do našej EmailService s @InjectMocks anotácia. Ďalšie podrobnosti nájdete v našom článku Mockito Annotations.

2.2. Pridajte ArgumentCaptor Lúka

Po druhé, pridajme nové ArgumentCaptor pole typu Email uložiť náš zachytený argument:

@Captor ArgumentCaptor emailCaptor;

2.3. Zachyťte argument

Po tretie, poďme použiť Mockito.overiť s ArgumentCaptor zachytiť Email:

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

Potom môžeme získať zachytenú hodnotu a uložiť ju ako novú Email objekt:

Email emailCaptorValue = emailCaptor.getValue ();

2.4. Skontrolujte zachytenú hodnotu

Na záver sa pozrime na celú skúšku s tvrdením na kontrolu zajatcov Email objekt:

@Test public void whenDoesSupportHtml_expectHTMLEmailFormat () {String to = "[chránený e-mailom]"; String subject = "Using ArgumentCaptor"; Reťazec body = "Hej, poďme použiť ArgumentCaptor"; emailService.send (komu, predmet, telo, pravda); Mockito.verify (platforma) .deliver (emailCaptor.capture ()); Hodnota e-mailu = emailCaptor.getValue (); assertEquals (Format.HTML, value.getFormat ()); }

3. Vyhnite sa pichaniu

Hoci môžeme použiť ArgumentCaptor s bodnutím, mali by sme sa tomu všeobecne vyhnúť. Pre objasnenie, v prípade Mockito to vo všeobecnosti znamená vyhnúť sa používaniu ArgumentCaptor s Mockito.kedy. S bodnutím by sme mali použiť ArgumentMatcher namiesto toho.

Pozrime sa na niekoľko dôvodov, prečo by sme sa mali vyhnúť pichaniu.

3.1. Znížená čitateľnosť testu

Najskôr zvážte jednoduchý test:

Poverovacie údaje poverenia = nové poverenia ("baeldung", "correct_password", "correct_key"); Mockito.when (platform.authenticate (Mockito.eq (credentials))) .thenReturn (AuthenticationStatus.AUTHENTICATED); assertTrue (emailService.authenticatedSuccessfully (poverenia));

Tu používame Mockito.eq (poverenia) určiť, kedy má falošný objekt vrátiť.

Ďalej zvážte rovnaký test s použitím ArgumentCaptor namiesto toho:

Poverenia poverenia = nové poverenia ("baeldung", "correct_password", "correct_key"); Mockito.when (platform.authenticate (credentialsCaptor.capture ())) .thenReturn (AuthenticationStatus.AUTHENTICATED); assertTrue (emailService.authenticatedSuccessfully (poverenia)); assertEquals (credentials, credentialsCaptor.getValue ());

Na rozdiel od prvého testu si všimnite, ako musíme vykonať dodatočné presadenie v poslednom riadku, aby sme mohli urobiť to isté ako Mockito.eq (poverenia).

Nakoniec si všimnite, ako nie je okamžite jasné, čo credentialsCaptor.capture () odkazuje na. Je to preto, že musíme vytvoriť únosca mimo riadok, na ktorom ho používame, čo znižuje čitateľnosť.

3.2. Znížená chyba Lokalizácia

Ďalším dôvodom je, že ak emailService.authenticatedSuccessfully nezavolá platforma.overiť, dostaneme výnimku:

org.mockito.exceptions.base.MockitoException: Nezachytila ​​sa žiadna hodnota argumentu!

Je to preto, lebo naša metóda s tvrdým prístupom nezachytila ​​argument. Skutočný problém sa však netýka samotného testu, ale skutočnej metódy, ktorú testujeme.

Inými slovami, nesprávne nás presmeruje na výnimku v teste, zatiaľ čo skutočná chyba je v metóde, ktorú testujeme.

4. Záver

V tomto krátkom návode sme sa pozreli na všeobecný prípad použitia ArgumentCaptor. Pozreli sme sa tiež na dôvody, prečo sa vyhnúť použitiu ArgumentCaptor s bodnutím. Ako obvykle sú všetky naše ukážky kódu dostupné na GitHub.


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