different types matchers provided mockito
najlepšie programy na obnovenie odstránených súborov
Úvod do rôznych typov Matcher v Mockito.
Mocks and Spies in Mockito boli podrobne vysvetlené v našom predchádzajúcom návode podrobných Mockito tréningová séria .
Čo sú Matchers?
Porovnávače sú ako regulárne výrazy alebo zástupné znaky, kde namiesto konkrétneho vstupu (a / alebo výstupu) zadáte rozsah / typ vstupu / výstupu, na základe ktorého môžu byť pahýly / špióni odpočinutí a hovory na pahýle môžu byť overené.
Všetci zápasníci Mockito sú súčasťou ‘ Mockito ‘ statická trieda.
Porovnávače sú mocný nástroj, ktorý umožňuje stenografický spôsob nastavenia stubov, ako aj verifikácie vyvolaných stubov uvedením vstupov argumentov ako všeobecných typov ku konkrétnym hodnotám v závislosti od prípadu použitia alebo scenára.
Čo sa dozviete:
Typy dohadzovačov v Mockito
V Mockite existujú zhruba 2 typy zlaďovačov alebo z hľadiska použitia možno porovnávače použiť pre 2 nižšie kategórie:
- Zhody argumentov počas nastavenia pahýľa
- Porovnávače overenia na overenie skutočných volaní stubov
Pre oba typy porovnávacích nástrojov, t. J. Argument a overenie, poskytuje Mockito obrovskú sadu porovnávacích nástrojov (kliknutie tu kompletný zoznam účastníkov zápasu).
Zhody argumentov
Nižšie sú uvedené najpoužívanejšie z nich:
Uvažujme o testovaní zoznamu IntegerList:
final List mockedIntList = mock(ArrayList.class);
# 1) any () - Prijme akýkoľvek objekt (vrátane nulového).
when (mockedIntList.get( any ())).thenReturn(3);
#dva) akýkoľvek (jazyková trieda Java) -
Príklad : any (ClassUnderTest.class) - Toto je konkrétnejší variant any () a bude akceptovať iba objekty typu triedy, ktorý je uvedený ako parameter šablóny.
when (mockedIntList.get( any (Integer.class))).thenReturn(3);
# 3) anyBoolean (), anyByte (), anyInt (), anyString (), anyDouble (), anyFloat (), anyList () a mnoho ďalších - Všetky z nich akceptujú akýkoľvek objekt zodpovedajúceho dátového typu aj nulové hodnoty.
when (mockedIntList.get( any Int())).thenReturn(3);
# 4) Špecifické argumenty - V prípade, že sú skutočné argumenty známe vopred, vždy sa odporúča použiť ich, pretože poskytujú väčšiu dôveru oproti všeobecným typom argumentov.
Príklad:
when(mockedIntList.get(1)).thenReturn(3);
Porovnávače overenia
Existuje niekoľko špecializovaných dohadzovačov, ktoré sú k dispozícii na očakávanie / presadzovanie vecí ako nie. simulovaných vyvolávaní.
U všetkých nasledujúcich zhadzovačov zvážme rovnaký zoznam príkladov, aký sme už použili predtým.
final List mockedIntList = mock(ArrayList.class);
# 1) Vysmievanie sa
i) Jednoduché vyvolanie v aplikácii Mock overí, či bola vysmievaná metóda volaná / interagovaná alebo nie, a to nastavením veľkosti zosmiešňovaného zoznamu na 5.
//arrange when(mockedList.size()).thenReturn(5); // act int size = mockedList.size(); // assert verify(mockedList).size();
ii) Konkrétny počet interakcií s vysmievanou metódou overuje počet č. koľkokrát sa očakávalo, že bude falošný zavolaný.
//arrange when(mockedList.size()).thenReturn(5); // act int size = mockedList.size(); // assert verify(mockedList, times(1)).size();
Ak chcete overiť 0 interakcií, jednoducho zmeňte hodnotu z 1 na 0 ako argument pre porovnávač časov ().
//arrange when(mockedList.size()).thenReturn(5); // act int size = mockedList.size(); // assert verify(mockedList, times(0)).size();
V prípade zlyhania vráti nasledujúce výnimky:
do) Ak sú očakávané vyvolania menšie ako skutočné vyvolania:
Príklad: Chcel 2-krát, ale 3-krát sa odvolal, potom sa Mockito vráti - “ verification.TooManyActualInvocations „
Príklad kódu:
final List mockedIntList = mock(ArrayList.class); // Arrange when(mockedIntList.get(anyInt())).thenReturn(3); // Act int response = mockedIntList.get(5); response = mockedIntList.get(3); response = mockedIntList.get(100); // Assert verify(mockedIntList, times(2)).get(anyInt());
b) Ak sú očakávané vyvolania väčšie ako skutočné vyvolania:
Príklad: Chcel 2-krát, ale vyvolal 1-krát, potom sa Mockito vráti - “ verification.TooLittleActualInvocations „
final List mockedIntList = mock(ArrayList.class); // Arrange when(mockedIntList.get(anyInt())).thenReturn(3); // Act int response = mockedIntList.get(5); response = mockedIntList.get(3); response = mockedIntList.get(100); // Assert verify(mockedIntList, times(4)).get(anyInt());
iii) Žiadne interakcie s konkrétnou metódou vysmievaného objektu.
final List mockedIntList = mock(ArrayList.class); // Arrange when(mockedIntList.get(anyInt())).thenReturn(3); // Act int response = mockedIntList.get(5); // Assert verify(mockedIntList, never()).size();
iv) Overte poradie zosmiešňovaných interakcií - Toto je obzvlášť užitočné, ak chcete zaistiť poradie, v ktorom boli volané metódy na zosmiešňovaných objektoch.
Príklad: Operácie podobné databáze, kde by test mal overiť poradie, v ktorom došlo k aktualizáciám databázy.
Pre ilustráciu na príklade - Pokračujme rovnakým zoznamom príkladov.
Teraz predpokladajme, že poradie volaní do zoznamu bolo v poradí, tj. Get (5), size (), get (2). Poradie overovania by malo byť rovnaké.
// Arrange when(mockedIntList.get(anyInt())).thenReturn(3); when(mockedIntList.size()).thenReturn(100); InOrder mockInvocationSequence = Mockito.inOrder(mockedIntList); // Act int response = mockedIntList.get(5); int size = mockedIntList.size(); response = mockedIntList.get(2); // Assert mockInvocationSequence.verify(mockedIntList, times(1)).get(anyInt()); mockInvocationSequence.verify(mockedIntList).size(); mockInvocationSequence.verify(mockedIntList, times(1)).get(anyInt());
V prípade nesprávnej overovacej sekvencie vyvolá Mockito výnimku - teda „ Verifikácia.VerificationInOrderFailure “.
Takže vo vyššie uvedenom príklade, ak zmením poradie overenia zámenou posledných dvoch riadkov, začnem dostávať výnimku VerificationInOrderFailure.
// Arrange when(mockedIntList.get(anyInt())).thenReturn(3); when(mockedIntList.size()).thenReturn(100); InOrder mockInvocationSequence = Mockito.inOrder(mockedIntList); // Act int response = mockedIntList.get(5); int size = mockedIntList.size(); response = mockedIntList.get(2); // Assert mockInvocationSequence.verify(mockedIntList, times(1)).get(anyInt()); mockInvocationSequence.verify(mockedIntList, times(1)).get(anyInt()); mockInvocationSequence.verify(mockedIntList).size();
(v) Skontrolujte, či došlo k interakcii najmenej / najviac krát.
(do) najmenej:
Príklad: atleast (3) - Overuje, či bol vysmievaný objekt vyvolaný / interagoval s najmenej trikrát počas testu. Takže ktorákoľvek z interakcií 3 alebo viac ako 3 by mala urobiť overenie úspešným.
// Arrange when(mockedIntList.get(anyInt())).thenReturn(3); // Act int response = mockedIntList.get(5); response = mockedIntList.get(2); // Assert verify(mockedIntList, atLeast(2)).get(anyInt());
V prípade chýb, tj. Keď sa skutočné vyvolania nezhodujú, vyvolá sa rovnaká výnimka ako v prípade zhody times (), tj „ verification.TooLittleActualInvocations ”
b) najviac:
Príklad: atmost (3) - overuje, či sa vysmievaný objekt počas testu vyvolal / interagoval s najmenej trikrát. Takže akákoľvek z 0,1,2 alebo 3 interakcií s falošnou vzorkou by mala urobiť overenie úspešným.
// Arrange when(mockedIntList.get(anyInt())).thenReturn(3); // Act int response = mockedIntList.get(5); response = mockedIntList.get(2); // Assert verify(mockedIntList, atMost(2)).get(anyInt()); verify(mockedIntList, atMost(2)).size();
# 2) Zhoda argumentov
Vo vyššie uvedenom vyvolaní je možné kombinovať porovnávače spolu s porovnávačmi argumentov, aby sa overili argumenty, pomocou ktorých bol simulovaný hovor vyvolaný.
- akýkoľvek()
- Konkrétne hodnoty - ak sú argumenty známe vopred, overte ich pomocou konkrétnych hodnôt.
- Ďalšie zhody argumentov ako - anyInt (), anyString () atď.
tipy a triky
# 1) Používanie Argument Capture počas overovania
zoznam programovacích jazykov na vysokej úrovni
Overenie zachytenia argumentu je zvyčajne užitočné, keď argument použitý niektorou stubbed metódou nie je odovzdávaný priamo cez volanie metódy, ale je vytváraný interne, keď sa volá testovaná metóda.
To je v podstate užitočné, ak vaša metóda závisí od jedného alebo viacerých spolupracovníkov, ktorých správanie bolo zneužité. Argumenty odovzdané týmto spolupracovníkom sú interným objektom alebo úplne novou sadou argumentov.
Potvrdenie skutočného argumentu, pomocou ktorého by sa zavolali spolupracovníci, zaisťuje veľkú dôveru v testovaný kód.
Mockito poskytuje ArgumentCaptor, ktorý sa dá použiť na overenie, a potom, keď sa volá „AgumentCaptor.getValue ()“, môžeme uplatniť skutočný zachytený argument proti očakávanému.
Pre ilustráciu si pozrite nasledujúci príklad:
V nižšie uvedenej metóde je Calculate model s triedou InventoryModel, ktorá sa vytvorí v tele metódy a ktorú potom použije InventoryService na aktualizáciu.
Teraz, ak chcete napísať test na overenie, s akým argumentom sa volala inventárna služba, môžete jednoducho použiť objekt ArgumentCaptor typu InventoryModel.
Testovaná metóda:
public double calculatePrice(int itemSkuCode) { double price = 0; // get Item details ItemSku sku = itemService.getItemDetails(itemSkuCode); // update item inventory InventoryModel model = new InventoryModel(); model.setItemSku(sku); model.setItemSuppliers(new String(){'Supplier1'}); inventoryService.updateInventory(model, 1); return sku.getPrice(); }
Testovací kód: Pozrite sa na krok overenia, kde sa overuje inventarizácia, a objekt argumentCaptor sa nahradí tým, ktorý argument je potrebné zhodovať.
Potom jednoducho uplatnite hodnotu vyvolaním metódy getValue () na objekte ArgumentCaptor.
Príklad: ArgumentCaptorObject.getValue ()
public void calculatePrice_withValidItemSku_returnsSuccess() { // Arrange ItemSku item1 = new ItemSku(); item1.setApplicableDiscount(5.00); item1.setPrice(100.00); CustomerProfile customerProfile = new CustomerProfile(); customerProfile.setExtraLoyaltyDiscountPercentage(2.00); double expectedPrice = 93.00; // Arrange when(mockedItemService.getItemDetails(anyInt())).thenReturn(item1); ArgumentCaptor argCaptorInventoryModel = ArgumentCaptor.forClass(InventoryModel.class); // Act priceCalculator.calculatePrice(1234); // Assert verify(mockedItemService).getItemDetails(anyInt()); verify(mockedInventoryService).updateInventory(argCaptorInventoryModel.capture(), eq(1)); assertEquals(argCaptorInventoryModel.getValue().itemSku, item1);
Bez ArgumentCaptor by nebolo možné určiť, s akým argumentom sa uskutočnilo volanie služby. Najlepšie je použiť na overenie argumentov „any ()“ alebo „any (InventoryModel.class)“.
# 2) Bežné výnimky / chyby pri používaní porovnávacích nástrojov
Pri používaní Matcherov existuje niekoľko konvencií, ktoré by ste mali dodržiavať, ktoré, ak nie sú dodržané, majú za následok vyhodenie výnimky. Najbežnejšia, na ktorú som narazil, je pichanie a overovanie.
Ak používate any argumentMatchers a ak má stubbed metóda viac ako jeden (é) argument (y), potom by mali byť všetky argumenty spomenuté spolu s porovnávačmi, inak by žiadny z nich nemal mať porovnávače. Čo to znamená?
Pokúsme sa to pochopiť pomocou scenára (a potom ukážky kódu pre tento scenár)
- Predpokladajme, že testovaná metóda má podpis ako -
concatenateString (reťazec arg1, reťazec arg2) - Teraz pri stubingu - predpokladajme, že poznáte hodnotu arg1, ale arg2 nie je známy, takže sa rozhodnete použiť porovnávač argumentov ako - any () alebo anyString () a zadať hodnotu pre prvý argument ako nejaký text „ahoj“.
- Po implementácii vyššie uvedeného kroku a vykonaní testu vyvolá test výnimku nazvanú „InvalidUseOfMatchersException“.
Pokúsme sa to pochopiť pomocou príkladu:
previesť youtube na mp3 dlhšie ako 30 minút
Testovací kód:
// Arrange when(a gMatcher.concatenateString('hello', anyString())).thenReturn('hello world!'); // Act String response = argMatcher.concatenateString('hello', 'abc'); // Assert verify(argMatcher).concatenateString(anyString(), anyString());
Testovaná trieda:
public class ArgMatcher { public String concatenateString(String arg1, String arg2) { return arg1.concat(arg2); } }
Po vykonaní vyššie uvedeného testu sa vráti v „ InvalidUseOfMatchersException „
Aký je dôvod tejto výnimky?
Jedná sa o stubbing pomocou kombinácie častí a časti fixného reťazca, t. J. Spomenuli sme jeden nástroj na porovnávanie argumentov ako „ahoj“ a druhý ako anyString (). Teraz existujú 2 spôsoby, ako sa zbaviť týchto druhov výnimiek (Upozorňujeme tiež - že toto správanie sa týka nastavení Mock aj správania).
# 1) Použite Argument Matchers pre všetky argumenty:
// Arrange when(a gMatcher.concatenateString(anyString(), anyString())).thenReturn('hello world!'); // Act String response = argMatcher.concatenateString('hello', 'abc'); // Assert verify(argMatcher).concatenateString(anyString(), anyString());
# 2) Použite eq () ako porovnávač argumentov, kde je známy argument. Namiesto zadania argumentu „ahoj“ ho teda zadajte ako „eq („ ahoj “) a malo by to byť úspešné.
// Arrange when(argMatcher.concatenateString(anyString(), eq('world'))).thenReturn('hello world!'); // Act String response = argMatcher.concatenateString('hello', 'world'); // Assert verify(argMatcher).concatenateString(anyString(), eq('world'));
Záver
V tomto článku sme videli, ako používať rôzne typy porovnávacích nástrojov, ktoré poskytuje Mockito.
Tu sme pokryli najbežnejšie používané. Pre odkaz na celý zoznam je dokumentácia Mockito Library dobrým zdrojom referencií.
V našom pripravovanom výučbe sa dozviete viac o súkromných, statických a neplatných metódach simulácie.
Výukový program PREV | NEXT Tutorial
Odporúčané čítanie
- Vytváranie simulátorov a špiónov v simulátore s príkladmi kódu
- Výukový program Mockito: Rámec Mockito pre simuláciu pri testovaní jednotiek
- Typy rizík v softvérových projektoch
- Dátové typy v Pythone
- Dátové typy C ++
- 12 najčastejších otázok týkajúcich sa rozhovorov (Mocking Framework Interview)
- Posmievanie súkromných, statických a neplatných metód pomocou makety
- Typy dedenia v C ++