different types matchers provided mockito
kako koristiti bujica datoteke nakon preuzimanja -
Uvod u različite vrste podudaranja u Mockitu.
Rugači i špijuni u Mockitu su detaljno objašnjeni u našem prethodnom detaljnom vodiču Mockito serija treninga .
Što su Matchers?
Podudaranja su poput regularnih izraza ili zamjenskih znakova gdje umjesto određenog ulaza (i / ili izlaza) odredite opseg / vrstu ulaza / izlaza na temelju kojih se klinovi / špijuni mogu odmarati i pozivi kvačicama mogu provjeriti.
Svi Mockito mečevi dio su Mockito ’ statička klasa.
Podudaranje je moćan alat koji omogućuje kratki način postavljanja kvara, kao i provjeru poziva na karikama spominjanjem unosa argumenata kao generičkih tipova do određenih vrijednosti, ovisno o slučaju ili scenariju.
Što ćete naučiti:
Vrste podudaranja u Mockitu
U Mockitu postoje općenito 2 vrste podudaranja ili što se tiče upotrebe, podudaranja se mogu koristiti za sljedeće dvije kategorije:
- Podudaranje argumenata tijekom postavljanja Stuba
- Verifikacijski podudarači za provjeru stvarnih poziva na klice
Za obje vrste podudaranja, tj. Argument i provjeru, Mockito nudi ogroman skup podudaranja (klik ovdje kako biste dobili cjelovit popis podudarnika).
Podudaranje argumenata
Navedeni su najčešće korišteni:
Za sve dolje, razmislimo o testiranju IntegerList:
final List mockedIntList = mock(ArrayList.class);
# 1) bilo koji () - prihvaća bilo koji objekt (uključujući null).
when (mockedIntList.get( any ())).thenReturn(3);
#dva) bilo koji (tečaj java jezika) -
Primjer : bilo koji (ClassUnderTest.class) - Ovo je specifičnija varijanta bilo kojeg () i prihvatit će samo objekte tipa klase koji su spomenuti kao parametar predloška.
when (mockedIntList.get( any (Integer.class))).thenReturn(3);
# 3) anyBoolean (), anyByte (), anyInt (), anyString (), anyDouble (), anyFloat (), anyList () i još mnogo toga - svi oni prihvaćaju bilo koji objekt odgovarajuće vrste podataka, kao i null vrijednosti.
when (mockedIntList.get( any Int())).thenReturn(3);
# 4) Specifični argumenti - U slučajevima kada su stvarni argumenti poznati unaprijed, uvijek se preporučuje njihova upotreba jer pružaju više povjerenja u odnosu na generičke tipove argumenata.
Primjer:
when(mockedIntList.get(1)).thenReturn(3);
Provjera podudaranja
Postoje neka specijalizirana podudaranja koja mogu očekivati / ustvrditi stvari poput br. zazivanja na laž.
Za sva donja podudaranja, razmotrimo isti popis primjera koji smo koristili prije.
final List mockedIntList = mock(ArrayList.class);
# 1) Ismijavanje poziva
(i) Jednostavno pozivanje na Mock provjerava je li ismijavana metoda pozvana / komunicirala ili ne postavljanjem veličine popisa ismijanih na 5.
//arrange when(mockedList.size()).thenReturn(5); // act int size = mockedList.size(); // assert verify(mockedList).size();
(ii) Određeni broj interakcija ismijanom metodom potvrđuje broj ne. puta se očekivalo da se izruguje.
//arrange when(mockedList.size()).thenReturn(5); // act int size = mockedList.size(); // assert verify(mockedList, times(1)).size();
Da biste provjerili 0 interakcija, jednostavno promijenite vrijednost od 1 do 0 kao argument za podudaranje times ().
//arrange when(mockedList.size()).thenReturn(5); // act int size = mockedList.size(); // assert verify(mockedList, times(0)).size();
U slučaju kvara, vraća sljedeće izuzeće:
do) Kada su očekivani pozivi manji od stvarnih poziva:
Primjer: Tražen 2 puta, ali pozvan 3 puta, a zatim se Mockito vraća - “ provjera.TooManyActualInvocations '
Primjer koda:
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) Kada su očekivani pozivi veći od stvarnih:
Primjer: Tražen 2 puta, ali pozvan 1 put, a zatim se Mockito vraća - “ provjera.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) Nema interakcije s određenom metodom ismijanog predmeta.
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) Provjerite redoslijed izrugivanih interakcija - Ovo je osobito korisno kada želite osigurati redoslijed pozivanja metoda na ismijanim objektima.
Primjer: Baza podataka poput operacija u kojima bi test trebao potvrditi redoslijed ažuriranja baze podataka.
Da to ilustriramo Primjerom - Nastavimo s istim popisom primjera.
Pretpostavimo sada da je redoslijed poziva metoda popisa bio u nizu, tj. Get (5), size (), get (2). Dakle, redoslijed provjere također bi trebao biti isti.
// 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());
U slučaju pogrešnog slijeda provjere, Mockito donosi izuzetak - tj. ' provjera.VerificationInOrderFailure '.
Dakle, u gornjem primjeru, ako promijenim redoslijed provjere izmjenom posljednja 2 retka, počet ću dobivati iznimku 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) Provjerite je li do interakcije došlo najmanje / najmanje nekoliko puta.
(do) barem:
Primjer: atleast (3) - provjerava je li ismijani objekt tri puta pozivan / komunicirao s atleastom tijekom testa. Dakle, bilo koja interakcija 3 ili veća od 3 trebala bi provjeru učiniti uspješnom.
// Arrange when(mockedIntList.get(anyInt())).thenReturn(3); // Act int response = mockedIntList.get(5); response = mockedIntList.get(2); // Assert verify(mockedIntList, atLeast(2)).get(anyInt());
U slučaju pogrešaka, tj. Kada se stvarni pozivi ne podudaraju, izbacuje se ista iznimka kao i kod podudaranja times () tj. ' provjera.TooLittleActualInvocations ”
kako pokrenuti .swf datoteke
(b) najviše:
Primjer: atmost (3) - provjerava je li izrugivani objekt tijekom testa pokrenut / reagiran s najmanje tri puta. Dakle, bilo koja od 0,1,2 ili 3 interakcije s lažnim modelom trebala bi provjeru učiniti uspješnom.
// 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) Podudaranje argumenata
U gore navedenom pozivu, podudaranja se mogu kombinirati zajedno s podudaranjima argumenata kako bi se potvrdili argumenti s kojima je lažni poziv pozvan.
- bilo koji ()
- Određene vrijednosti - Potvrdite određenim vrijednostima kada su argumenti poznati unaprijed.
- Ostala podudaranja argumenata poput - anyInt (), anyString () itd.
savjeti i trikovi
# 1) Korištenje Argument Capture tijekom provjere
Provjera hvatanja argumenata obično je korisna kada se argument koji koristi neka zaostala metoda ne prenosi izravno putem poziva metode, već se stvara interno kada se pozove metoda koja se ispituje.
Ovo je u osnovi korisno kada vaša metoda ovisi o jednom ili više suradnika čije je ponašanje ukočeno. Argumenti prosljeđeni tim suradnicima unutarnji su objekt ili potpuno novi skup argumenata.
Potvrđivanje stvarnog argumenta s kojim bi suradnici bili pozvani osigurava puno povjerenja u kod koji se testira.
Mockito nudi ArgumentCaptor koji se može koristiti s provjerom, a onda kada se pozove 'AgumentCaptor.getValue ()', možemo utvrditi stvarni zarobljeni argument protiv očekivanog.
Da biste to ilustrirali, pogledajte primjer u nastavku:
U donjoj metodi, CalcuPrice je model s klasom InventoryModel koji se kreira unutar tijela metode koji zatim koristi InventoryService za ažuriranje.
Sada ako želite napisati test za provjeru s kojim argumentom je pozvan inventoryService, možete jednostavno koristiti objekt ArgumentCaptor tipa InventoryModel klase.
koliko je prodajno mjesto na brzim knjigama
Metoda koja se ispituje:
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(); }
Testni kod: Pogledajte korak provjere gdje je provjerena inventoryService, objekt argumentCaptor je zamijenjen za koji argument se mora podudarati.
Zatim jednostavno potvrdite vrijednost pozivanjem metode getValue () na objektu ArgumentCaptor.
Primjer: 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 ne bi bilo načina identificirati s kojim je argumentom upućen poziv usluge. Najbolje je koristiti 'bilo koji ()' ili 'bilo koji (InventoryModel.class)' za provjeru argumenata.
# 2) Uobičajene iznimke / pogreške tijekom upotrebe podudaranja
Tijekom korištenja Matchera postoje određene konvencije kojih se treba pridržavati, a ako se ne slijede, rezultiraće izbacivanjem iznimke. Najčešći na koji sam naišao je dok trljam i provjeravam.
Ako koristite bilo koji argumentMatchers i ako stubbed metoda ima više argumenata, tada se svi argumenti trebaju spomenuti s podudaranjima, inače niti jedan od njih ne bi trebao imati podudaranja. Što to znači?
Pokušajmo to razumjeti scenarijem (a zatim uzorkom koda za ovaj scenarij)
- Pretpostavimo da metoda koja se ispituje ima potpis poput -
concatenateString (String arg1, String arg2) - Sada kada zaglupljujete - pretpostavimo da znate vrijednost arg1, ali arg2 je nepoznat, pa ste odlučili upotrijebiti podudaranje argumenata poput - any () ili anyString () i odrediti vrijednost za prvi argument poput nekog teksta 'zdravo'.
- Kada se provede gornji korak i izvrši test, test izbacuje iznimku koja se naziva „InvalidUseOfMatchersException“
Pokušajmo to razumjeti na primjeru:
Testni kod:
// Arrange when(a gMatcher.concatenateString('hello', anyString())).thenReturn('hello world!'); // Act String response = argMatcher.concatenateString('hello', 'abc'); // Assert verify(argMatcher).concatenateString(anyString(), anyString());
Predmet koji se ispituje:
public class ArgMatcher { public String concatenateString(String arg1, String arg2) { return arg1.concat(arg2); } }
Kada se izvrši gornji test, vraća se u “ InvalidUseOfMatchersException '
Koji je razlog ove iznimke?
To je kicanje pomoću podudaranja dijelova i dijelova fiksnog niza, tj. Spomenuli smo jedno podudaranje argumenata kao 'zdravo', a drugo kao anyString (). Sada postoje 2 načina da se riješite ove vrste iznimaka (Također imajte na umu - da se ovo ponašanje odnosi i na Mock postavke, kao i na ponašanje).
# 1) Koristite Argument Matchers za sve argumente:
// Arrange when(a gMatcher.concatenateString(anyString(), anyString())).thenReturn('hello world!'); // Act String response = argMatcher.concatenateString('hello', 'abc'); // Assert verify(argMatcher).concatenateString(anyString(), anyString());
# 2) Upotrijebite eq () kao Argument Matcher ako je argument poznat. Dakle, umjesto da argument navedete kao 'zdravo', navedite ga kao 'eq (' zdravo '), a to bi trebalo učiniti uspješno.
// Arrange when(argMatcher.concatenateString(anyString(), eq('world'))).thenReturn('hello world!'); // Act String response = argMatcher.concatenateString('hello', 'world'); // Assert verify(argMatcher).concatenateString(anyString(), eq('world'));
Zaključak
U ovom smo članku vidjeli kako koristiti različite vrste podudaranja koje nudi Mockito.
Ovdje smo pokrili one najčešće korištene. Za upućivanje na cjelovit popis dobar je izvor reference za dokumentaciju Mockito Library.
Pogledajte naš predstojeći vodič da biste saznali više o privatnim, statičkim i praznim metodama ruganja.
Preporučena literatura
- Stvaranje ismijavanja i špijuna u Mockitu s primjerima koda
- Vodič za Mockito: Mockito okvir za ruganje u jedinstvenom testiranju
- Vrste rizika u softverskim projektima
- Python tipovi podataka
- Vrste podataka C ++
- 12 najpopularnijih pitanja o Mockito intervjuu (Podrugljivi okvirni intervju)
- Ismijavanje privatnih, statičkih i praznih metoda korištenjem Mockita
- Vrste nasljeđivanja u C ++