different types matchers provided mockito
kakšna je faza izvedbe v sdlc
Uvod v različne vrste tekem v Mockitu.
Mocki in vohuni v Mockitu so bile podrobno razložene v naši prejšnji vadnici Mockito serija treningov .
Kaj so Matchers?
Ujemanja so kot regularni izrazi ali nadomestni znaki, pri katerih namesto določenega vhoda (in / ali izhoda) določite obseg / vrsto vhoda / izhoda, na podlagi katerega lahko škrbine / vohuni počivajo in klice na opore lahko preverite.
Vsa tekmovanja Mockito so del Mockito ' statični razred.
Ujemanja so močno orodje, ki omogoča okrajšani način nastavitve škrbine in preverjanje klicev na ogenjih z omembo vnosov argumentov kot generičnih tipov do določenih vrednosti, odvisno od primera uporabe ali scenarija.
Kaj se boste naučili:
Vrste tekem v Mockitu
V Mockitu obstajata na splošno dve vrsti tekem ali v smislu uporabe se lahko ujemajo za spodnji dve kategoriji:
- Argument Matchers med nastavitvijo Stub
- Verifikacijska ujemanja za preverjanje dejanskih klicev na klice
Za obe vrsti ujemanj, tj. Argumenta in preverjanja, Mockito ponuja ogromen nabor ujemanj (kliknite tukaj da dobite popoln seznam tekmovalcev).
Argument Matches
Našteti so najpogosteje uporabljeni:
Za vse spodnje razmislimo o testiranju seznama IntegerList:
final List mockedIntList = mock(ArrayList.class);
# 1) any () - sprejme kateri koli predmet (vključno z ničelnim).
when (mockedIntList.get( any ())).thenReturn(3);
#two) poljubno (tečaj jezika java) -
Primer : kateri koli (ClassUnderTest.class) - to je natančnejša različica katerega koli () in sprejema samo predmete vrste razreda, ki so omenjeni kot parameter predloge.
when (mockedIntList.get( any (Integer.class))).thenReturn(3);
# 3) anyBoolean (), anyByte (), anyInt (), anyString (), anyDouble (), anyFloat (), anyList () in še veliko več - vsi ti sprejemajo kateri koli predmet ustreznega podatkovnega tipa, kot tudi ničelne vrednosti.
when (mockedIntList.get( any Int())).thenReturn(3);
# 4) Posebni argumenti - V primerih, ko so dejanski argumenti znani vnaprej, je vedno priporočljivo, da jih uporabite, saj zagotavljajo večjo samozavest v primerjavi z generičnimi vrstami argumentov.
Primer:
when(mockedIntList.get(1)).thenReturn(3);
Preverjanje ujemanj
Obstaja nekaj specializiranih tekmovalcev, ki lahko pričakujejo / uveljavljajo stvari, kot je št. klicev na lažno.
Za vse spodnje tekme si oglejmo isti seznam primerov, ki smo ga uporabili že prej.
final List mockedIntList = mock(ArrayList.class);
# 1) Lažni pozivi
(jaz) Preprost priklic v Mocku preveri, ali je bila posmehkana metoda klicana / uporabljena ali ne, tako da nastavite velikost posmešljivega seznama na 5
//arrange when(mockedList.size()).thenReturn(5); // act int size = mockedList.size(); // assert verify(mockedList).size();
(ii) Določeno število interakcij s posmehljivo metodo potrjuje število št. včasih je bilo pričakovati, da se bo posmeh poklical.
//arrange when(mockedList.size()).thenReturn(5); // act int size = mockedList.size(); // assert verify(mockedList, times(1)).size();
Če želite preveriti za 0 interakcij, preprosto spremenite vrednost z 1 na 0 kot argument za ujemanje times ().
//arrange when(mockedList.size()).thenReturn(5); // act int size = mockedList.size(); // assert verify(mockedList, times(0)).size();
V primeru napak vrne naslednje izjeme:
do) Ko so pričakovani klici manjši od dejanskih klicev:
Primer: Dvakrat iskan, vendar poklican trikrat, nato se Mockito vrne - “ preverjanje.TooManyActualInvocations '
najboljši brezplačni prenosnik glasbe za pc
Primer kode:
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) Ko so pričakovani klici večji od dejanskih klicev:
Primer: Dvakrat iskan, vendar enkrat poklican, nato se Mockito vrne - “ preverjanje.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) Ni interakcij s posebno metodo posmehovanega 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) Preverite vrstni red posmehovanih interakcij - to je še posebej koristno, če želite zagotoviti vrstni red, v katerem so bile klicane metode na posmehljivih predmetih.
Primer: Zbirka podatkov, kot so operacije, pri katerih mora test preveriti vrstni red posodobitev baze podatkov.
Za ponazoritev tega na primeru - Nadaljujmo z istim seznamom primerov.
Zdaj domnevamo, da je bil vrstni red klicev metod seznama zaporeden, tj. Get (5), size (), get (2). Torej bi moral biti tudi vrstni red preverjanja enak.
// 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 primeru napačnega zaporedja preverjanja Mockito pripravi izjemo - tj. preverjanje.VerificationInOrderFailure '.
Torej, v zgornjem primeru, če spremenim vrstni red preverjanja z zamenjavo zadnjih dveh vrstic, začnem prejemati izjemo 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) Preverite, ali je do interakcije prišlo vsaj / največkrat.
(do) vsaj:
Primer: atleast (3) - preveri, ali je bil med preskusom posmehani predmet trikrat poklican / v interakciji z njim. Torej bi moralo biti preverjanje uspešno zaradi katere koli interakcije 3 ali večje od 3.
// 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 primeru napak, tj. Ko se dejanski klici ne ujemajo, se vrže enaka izjema kot pri ujemanju times (), tj. preverjanje.TooLittleActualInvocations '
(b) največ:
Primer: atmost (3) - preveri, ali je bil med preskusom posmehani predmet poklican ali v interakciji z njim vsaj trikrat. Torej bi morala biti katera koli 0,1,2 ali 3 interakcija z lažnim vzorcem uspešno preverjanje.
// 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) Ujemanje argumentov
V zgornjem pozivu lahko ujemanja kombiniramo skupaj z ujemajočimi se argumenti, da potrdimo argumente, s katerimi je bil poklican posmeh.
- kaj()
- Določene vrednosti - preverite s posebnimi vrednostmi, če so argumenti vnaprej znani.
- Druga ujemanja argumentov, kot so - anyInt (), anyString () itd.
Nasveti in triki
# 1) Uporaba Argument Capture med preverjanjem
Preverjanje zajemanja argumentov je običajno koristno, kadar argument, ki ga uporablja neka metoda z ostrenjem, ni poslan neposredno prek klica metode, ampak je ustvarjen interno, ko je poklicana preskušana metoda.
To je v bistvu koristno, kadar je vaša metoda odvisna od enega ali več sodelavcev, katerih vedenje je bilo omamljeno. Argumenti, posredovani tem sodelavcem, so notranji objekt ali povsem nov nabor argumentov.
Preverjanje dejanskega argumenta, s katerim bi poklicali sodelavce, zagotavlja veliko zaupanje v kodo, ki se preskuša.
Mockito ponuja ArgumentCaptor, ki ga lahko uporabljamo za preverjanje, nato pa lahko, ko pokličete 'AgumentCaptor.getValue ()', uveljavite dejanski zajeti argument proti pričakovanemu.
vprašanja in odgovori za intervju z milnico
Za ponazoritev glejte spodnji primer:
V spodnji metodi je calcuPrice model z razredom InventoryModel, ki je ustvarjen znotraj telesa metode, ki ga nato InventoryService uporablja za posodobitev.
Zdaj, če želite napisati test za potrditev, s katerim argumentom je bila poklicana inventoryService, lahko preprosto uporabite objekt ArgumentCaptor tipa InventoryModel.
Preskušana metoda:
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(); }
Testna koda: Oglejte si korak preverjanja, kjer je preverjena inventoryService, nadomeščen je argument argumentCaptor, kateremu argumentu je treba ujemati.
Nato preprosto uveljavite vrednost, tako da prikličete metodo getValue () v objektu ArgumentCaptor.
Primer: 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);
Brez ArgumentCaptor ne bi bilo mogoče ugotoviti, s katerim argumentom je bil opravljen klic storitve. Najbolje je, da za preverjanje argumentov uporabite »kateri koli ()« ali »kateri koli (InventoryModel.class)«.
# 2) Pogoste izjeme / napake med uporabo Matchers
Med uporabo Matchers obstajajo določene konvencije, ki jih je treba upoštevati, in če se ne upoštevajo, se vrne izjema. Najpogostejši, na katerega sem naletel, je med trkanjem in preverjanjem.
Če uporabljate kateri koli argumentMatchers in če ima metoda stubbed več kot en argument, je treba vse argumente omeniti z ujemajočimi se, sicer nobeden od njih ne sme imeti ujemanj. Kaj to pomeni?
Poskusimo to razumeti s scenarijem (in nato vzorcem kode za ta scenarij)
- Recimo, da ima preskušana metoda podpis, kot je -
concatenateString (niz arg1, niz arg2) - Zdaj pri zatiranju - predpostavimo, da poznate vrednost arg1, vendar je arg2 neznan, zato se odločite za ujemanje argumentov, kot je - any () ali anyString (), in določite vrednost za prvi argument, kot je besedilo 'hello'.
- Ko je zgornji korak izveden in test izveden, test vrže izjemo, imenovano 'InvalidUseOfMatchersException'
Poskusimo to razumeti s primerom:
Testna koda:
// Arrange when(a gMatcher.concatenateString('hello', anyString())).thenReturn('hello world!'); // Act String response = argMatcher.concatenateString('hello', 'abc'); // Assert verify(argMatcher).concatenateString(anyString(), anyString());
Preizkušeni razred:
public class ArgMatcher { public String concatenateString(String arg1, String arg2) { return arg1.concat(arg2); } }
Ko se zgornji test izvede, se vrne v “ InvalidUseOfMatchersException '
Kaj je razlog za to izjemo?
Gre za ostrenje z uporabo delnih ujemanj in delno fiksnih nizov, tj. Eno ujemanje argumentov smo omenili kot 'hello' in drugo kot anyString (). Zdaj obstajata dva načina, kako se znebiti tovrstnih izjem (upoštevajte tudi, da to vedenje velja tako za nastavitve Mock kot tudi za vedenje).
# 1) Uporabite Argument Matchers za vse 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) Uporabite eq () kot Argument Matcher, kjer je argument znan. Torej, namesto da argument navedete kot 'zdravo', ga določite kot 'eq (' zdravo ') in to bi moralo omogočiti trpanje uspeš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ček
V tem članku smo videli, kako uporabljati različne vrste ujemanj, ki jih ponuja Mockito.
Tu smo zajeli najpogosteje uporabljene. Za sklicevanje na celoten seznam je dokumentacija Mockito Library dober referenčni vir.
Oglejte si našo prihajajočo vadnico, če želite izvedeti več o zasebnih, statičnih in praznih metodah posmehovanja.
PREV Vadnica | NASLEDNJA Vadnica
Priporočeno branje
- Ustvarjanje posmehov in vohunov v Mockitu s primeri kode
- Vadnica za Mockito: Mockito Framework za posmeh pri preskušanju enot
- Vrste tveganj pri programskih projektih
- Vrste podatkov Python
- Vrste podatkov C ++
- 12 najboljših vprašanj o intervjuju Mockito (posmehljivi okvirni intervju)
- Posmehovanje zasebnim, statičnim in praznim metodam z uporabo Mockita
- Vrste dedovanja v jeziku C ++