Mockito ArgumentMatchers

1. Prehľad

Tento návod ukazuje ako používať ArgumentMatcher a ako sa líši od ArgumentCaptor.

Úvod do rámca Mockito nájdete v tomto článku.

2. Maven závislosti

Musíme pridať jeden artefakt:

 org.mockito maketa-jadro 2.21.0 test 

Najnovšia verzia servera Mockito nájdete na Maven Central.

3. ArgumentMatchers

Je možné nakonfigurovať zosmiešňovanú metódu rôznymi spôsobmi. Jedným z nich je vrátenie pevných hodnôt:

doReturn ("Kvetina"). keď (flowerService) .analyze ("mak");

Vo vyššie uvedenom príklade String „Kvetina“ sa vráti iba vtedy, keď analytická služba dostane String „Mak“.

ale možno musíme odpovedať na širší rozsah hodnôt alebo vopred neznáme hodnoty.

Vo všetkých týchto scenároch môžeme nakonfigurovať naše vysmievané metódy pomocou argumentdohadzovači:

keď (flowerService.analyze (anyString ())). thenReturn ("Kvetina");

Teraz kvôli anyString porovnávač argumentov, výsledok bude rovnaký bez ohľadu na to, akú hodnotu odovzdáme analýze. ArgumentMatchers umožňuje nám flexibilné overenie alebo zablokovanie.

V prípade, že metóda má viac ako jeden argument, nie je možné použiť ArgumentMatchers iba pre niektoré z argumentov. Mockito vyžaduje, aby ste poskytli všetky argumenty buď do dohadzovači alebo presnými hodnotami.

Ďalším príkladom je nesprávny prístup k tomuto:

abstraktná trieda FlowerService {verejný abstrakt boolean isABigFlower (názov reťazca, okvetné lístky); } FlowerService mock = predstieraný (FlowerService.class); when (mock.isABigFlower ("poppy", anyInt ())). thenReturn (true);

Ak to chcete opraviť a zachovať String názov „mak“, ako sa požaduje, použijeme porovnávač eq:

when (mock.isABigFlower (eq ("poppy"), anyInt ())). thenReturn (true);

Keď je treba sa postarať o ďalšie dva body dohadzovači sa používajú:

  • Nemôžeme ich použiť ako návratnú hodnotu, je pri zadávaní hovorov požadovaná presná hodnota
  • Nakoniec nemôžeme použiť argument dohadzovači mimo overenia alebo pichnutia

V poslednom prípade Mockito zistí nesprávne umiestnený argument a hodí InvalidUseOfMatchersException.

Zlým príkladom môže byť:

Reťazec orMatcher = alebo (eq ("mak"), endsWith ("y")); overiť (falošne) .analyzovať (aleboMatcher);

Vyššie uvedený kód je možné implementovať takto:

overiť (falošne) .analyzovať (alebo (eq („mak“), končí na („y“))));

Mockito tiež poskytuje AdditionalMatchers implementovať bežné logické operácie („nie“, „a“, „alebo“) na ArgumentMatchers ktoré zodpovedajú primitívnym aj neprimitívnym typom:

overiť (falošne) .analyzovať (alebo (eq („mak“), končí na („y“))));

4. Custom Argument Matcher

Tvorenie náš dohadzovač môže byť dobré zvoliť najlepší možný prístup pre daný scenár a vypracovať test najvyššej kvality, ktorý je čistý a udržiavateľný.

Napríklad by sme mohli mať a MessageController ktorý doručuje správy. Dostane MessageDTOa z toho vytvorí Správa dodať do MessageService.

Naše overenie bude jednoduché, overte, či sme volali MessageService presne 1 krát s akákoľvek správa:

verifikácia (messageService, times (1)). deliverMessage (any (Message.class));

Pretože the Správa je skonštruovaná vo vnútri testovanej metódy, sme nútení používať akýkoľvek ako dohadzovač.

Tento prístup nám neumožňuje overiť údaje vo vnútri servera Správa, ktoré sa môžu líšiť v porovnaní s údajmi vo vnútri MessageDTO.

Z tohto dôvodu budeme implementovať vlastný porovnávač argumentov:

verejná trieda MessageMatcher implementuje ArgumentMatcher {súkromná správa vľavo; // konštruktory @Override verejné booleovské zhody (Správa vpravo) {návrat vľavo.getFrom (). equals (right.getFrom ()) && left.getTo (). equals (right.getTo ()) && left.getText (). equals (right.getText ()) && right.getDate ()! = null && right.getId ()! = null; }}

Ak chcete použiť náš porovnávač, musíme upraviť náš test a vymeniť ho akýkoľvek od argThat:

verify (messageService, times (1)). deliverMessage (argThat (nový MessageMatcher (správa)));

Teraz už vieme svoje Správa inštancia bude mať rovnaké údaje ako naše MessageDTO.

5. Custom Argument Matcher vs. ArgumentCaptor

Obidve techniky vlastné porovnávače argumentov a ArgumentCaptor možno použiť na zaistenie toho, aby boli určité argumenty odovzdané falošným

AvšakArgumentCaptor môže byť vhodnejšia, ak ju potrebujeme na uplatnenie hodnôt argumentov na dokončenie overenia alebo náš vlastný porovnávač argumentov pravdepodobne nebude znovu použité.

Vlastné porovnávače argumentov cez ArgumentMatcher sú zvyčajne lepšie na pichnutie.

6. Záver

V tomto článku sme preskúmali funkciu Mockito, ArgumentMatcher a jeho rozdiel s ArgumentCaptor.

Celý zdrojový kód príkladov je ako vždy k dispozícii na serveri GitHub.


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