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.