Mockito ArgumentMatchers

1. Áttekintés

Ez az oktatóanyag megmutatja hogyan kell használni a ArgumentMatcher és miben különbözik a ArgumentCaptor.

A Mockito keretrendszer bemutatásához olvassa el ezt a cikket.

2. Maven-függőségek

Hozzá kell adnunk egyetlen műtárgyat:

 org.mockito mockito-core 2.21.0 teszt 

A legfrissebb verziója Mockito oldalon található Maven Central.

3. ArgumentMatchers

A csúfolt módszer különböző módokon történő konfigurálása lehetséges. Az egyik a rögzített értékek visszaadása:

doReturn ("Virág"). mikor (virágSzolgáltatás) .analízis ("mák");

A fenti példában a Húr A „virág” csak akkor kerül visszaadásra, ha az elemző szolgáltatás megkapja a Húr "mák".

De talán szélesebb értéktartományra vagy előre ismeretlen értékekre kell reagálnunk.

Mindezen forgatókönyvek a gúnyolt metódusainkkal konfigurálhatjuk érvpárosok:

mikor (flowerService.analyze (anyString ())). thenReturn ("Virág");

Most, a anyString argumentum-egyező, az eredmény ugyanaz lesz, függetlenül attól, hogy milyen értéket adunk át elemzésre. ArgumentMatchers lehetővé teszi számunkra a rugalmas ellenőrzést vagy elcsépelést.

Ha egy módszernek több argumentuma van, nem lehet használni ArgumentMatchers csak néhány érvre. Mockito megköveteli, hogy az összes érvet adja meg párosok vagy pontos értékekkel.

A következő példa erre téves megközelítés:

absztrakt osztály FlowerService {nyilvános absztrakt logikai isABigFlower (String név, int szirmok); } FlowerService gúny = gúny (FlowerService.class); mikor (mock.isABigFlower ("pipacs", anyInt ())). thenReturn (true);

Javításhoz és a Húr nevét „pipacs”, ahogy kívánjuk, mi használni fogjuk egyenlő páros:

mikor (mock.isABigFlower (eq ("pipacs"), anyInt ())). thenReturn (true);

Két további pontra kell vigyázni, amikor párosok használt:

  • Nem használhatjuk őket visszatérítési értékként, egy pontos értékre van szükség a hívások elrablása során
  • Végül, nem használhatunk érvet párosok ellenőrzésen vagy elcsépelésen kívül

Végső esetben, Mockito észleli a helytelen érvet és dob egy InvalidUseOfMatchersException.

Rossz példa lehet:

String orMatcher = vagy (eq ("pipacs"), végeWith ("y")); ellenőrizni (gúnyolódni) .analizálni (vagyMatcher);

A fenti kód megvalósításának módja:

verify (mock) .analyze (or (eq ("mák"), endWith ("y"))));

Mockito is előírja AdditionalMatchers közös logikai műveletek („nem”, „és”, „vagy”) végrehajtására ArgumentMatchers amelyek megfelelnek mind a primitív, mind a nem primitív típusoknak:

verify (mock) .analyze (or (eq ("mák"), endWith ("y"))));

4. Egyéni argumentumillesztõ

Teremtés a mi páros jó lehet kiválasztani a lehető legjobb megközelítést egy adott forgatókönyvhöz és a legmagasabb minőségű tesztet elkészíteni, amely tiszta és karbantartható.

Például lehet egy MessageController amely üzeneteket küld. Megkapja a MessageDTO, és ebből létrehoz egy Üzenet által szállított MessageService.

Ellenőrzésünk egyszerű lesz, ellenőrizze, hogy felhívtuk-e MessageService pontosan 1 alkalommal bármilyen üzenet:

ellenőrizze (messageService, times (1)). deliveryMessage (any (Message.class));

Mivel a Üzenet a vizsgált módszer belsejében épül fel, kénytelenek vagyunk használni Bármi mint a páros.

Ez a megközelítés nem engedi érvényesíteni a Üzenet, ami eltérhet a bent lévő adatoktól MessageDTO.

Ezért bevezetünk egy egyéni argumentumillesztőt:

public class MessageMatcher megvalósítja az ArgumentMatcher {private Message left; // konstruktorok @Orride nyilvános logikai egyezések (Üzenet jobb) {return left.getFrom (). egyenlő (right.getFrom ()) && left.getTo (). egyenlő (right.getTo ()) && left.getText (). egyenlő (right.getText ()) && right.getDate ()! = null && right.getId ()! = null; }}

Az illesztőnk használatához módosítanunk kell a tesztünket és ki kell cserélnünk Bármi által argThat:

ellenőrizze (messageService, times (1)). deliveryMessage (argThat (új MessageMatcher (üzenet)));

Most már tudjuk a mi Üzenet példánynak ugyanazok az adatai lesznek, mint a mi MessageDTO.

5. Egyéni argumentumillesztõ vs. ArgumentCaptor

Mindkét technika egyéni argumentumillesztők és ArgumentCaptor felhasználható annak biztosítására, hogy bizonyos érveket átadtak a gúnyoknak.

Azonban,ArgumentCaptor jobban illeszkedik, ha szükségünk van rá az argumentumértékek érvényesítéséhez az ellenőrzés befejezéséhez vagy a mi egyéni argumentumillesztõ valószínűleg nem fogják újrafelhasználni.

Egyéni argumentumillesztők keresztül ArgumentMatcher általában jobb a csöppséghez.

6. Következtetés

Ebben a cikkben a Mockito, ArgumentMatcher és annak különbsége ArgumentCaptor.

Mint mindig, a példák teljes forráskódja elérhető a GitHubon.


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