mocking private static
Naučite se posmehovanja zasebnim, statičnim in praznim metodam v Mockitu s primeri:
V tej seriji praktičnih Vadnice o Mockitu , smo si ogledali različne vrste Mockito Matchers v zadnji vadnici.
Na splošno se posmehovanje zasebnim in statičnim metodam uvršča v kategorijo nenavadnega posmehovanja.
Če se pojavi potreba po posmehovanju zasebnih in statičnih metod / razredov, to kaže na slabo preoblikovano kodo in v resnici ni preizkusne kode ter je najverjetneje neka starejša koda, ki včasih ni bila zelo enostavna.
Kljub temu pa še vedno obstaja podpora za posmehovanje zasebnih in statičnih metod z nekaj okviri za enotno testiranje, kot je PowerMockito (in ne neposredno s strani Mockito).
Posmehljive metode 'void' so pogoste, saj morda obstajajo metode, ki v bistvu ne vrnejo ničesar, na primer posodabljanje vrstice baze podatkov (upoštevajte jo kot operacijo PUT končne točke API za počitek, ki sprejme vhod in ne vrne nobenega izhoda).
Mockito nudi popolno podporo za posmehovanje praznim metodam, kar bomo videli s primeri v tem članku.
najboljši program za spremljanje temperature CPU in GPU
Kaj se boste naučili:
- Powermock - kratek uvod
- Posmehovanje zasebnim metodam
- Posmehovanje statičnim metodam
- Posmehljive metode praznine
- Nasveti in triki
- Zaključek
- Priporočeno branje
Powermock - Kratek uvod
Za Mockito ni neposredne podpore za posmeh zasebnim in statičnim metodam. Če želite preizkusiti zasebne metode, boste morali refaktor kode Če želite spremeniti dostop do zaščitenega (ali paketa), se boste morali izogniti statičnim / končnim metodam.
Po mojem mnenju Mockito namerno ne nudi podpore tovrstnim posmehom, saj je uporaba tovrstnih konstrukcij kode vonj kode in slabo zasnovana koda.
Vendar obstajajo okviri, ki podpirajo posmehovanje zasebnim in statičnim metodam.
Powermock razširi zmogljivosti drugih okvirov, kot sta EasyMock in Mockito, ter omogoča posmehovanje statičnim in zasebnim metodam.
# 1) Kako: Powermock to stori s pomočjo manipulacije bajt kod po meri, da bi podprl posmehovanje zasebnih in statičnih metod, končnih razredov, konstruktorjev itd.
# 2) Podprti paketi: Powermock ponuja dva API-ja za razširitve - enega za Mockito in enega za easyMock. Zaradi tega članka bomo napisali primere z razširitvijo Mockito za mock mock.
# 3) Sintaksa :Powermockito ima skoraj podobno sintakso kot Mockito, razen nekaterih dodatnih metod za posmehovanje statičnim in zasebnim metodam.
# 4) Nastavitev Powermockito
Za vključitev knjižnice Mockito v projekte, ki temeljijo na gradle, so spodaj navedene knjižnice, ki jih je treba vključiti:
testCompile group: 'org.powermock', name: 'powermock-api-mockito2', version: '1.7.4' testCompile group: 'org.powermock', name: 'powermock-module-junit4', version: '1.7.4'
Podobne odvisnosti so na voljo tudi za maven.
Powermock-api-mockito2 - Knjižnica mora vsebovati razširitve Mockito za Powermockito.
Powermock-module-junit4 - Modul mora vključevati PowerMockRunner (ki je po meri uporabljen tekač, ki se uporablja za izvajanje preskusov z PowerMockito).
Pomembno je omeniti, da PowerMock ne podpira testnega tekača Junit5. Zato je treba teste napisati proti Junit4, teste pa je treba izvesti z PowerMockRunner.
Če želite uporabljati PowerMockRunner - testni razred mora biti označen s @RunWith (PowerMockRunner.class)
Zdaj pa se podrobno pogovorimo, posmehujmo se zasebnim, statičnim in praznim metodam!
Posmehovanje zasebnim metodam
Posmehovanje zasebnim metodam, ki jih interno pokličemo iz preskušane metode, je v določenih trenutkih neizogibno. Z uporabo powermockito je to mogoče in preverjanje se opravi z novo metodo z imenom 'verifyPrivate'
Vzemimo anPrimer kjer testna metoda prikliče zasebno metodo (ki vrne logično vrednost). Če želite, da ta metoda vrne true / false glede na test, je treba za ta razred nastaviti škrbino.
V tem primeru je preizkušeni razred ustvarjen kot vohunski primerek z posmehovanjem nekaj klicem vmesnika in priklicem zasebne metode.
Pomembne točke za Mock Private Method:
# 1) Preskusno metodo ali preskusni razred je treba označiti z @ PrepareForTest (ClassUnderTest). Ta pripis sporoča powerMockito, da pripravi določene razrede za testiranje.
To bodo večinoma tisti razredi, ki morajo biti Bytecode manipulira . Običajno za zaključne razrede so razredi, ki vsebujejo zasebne in / ali statične metode, ki jih je treba med preizkušanjem posmehovati.
Primer:
@PrepareForTest(PriceCalculator.class)
#two) Za nastavitev škrbine na zasebni način.
Sintaksa - when (lažni ali vohunski primerek, “privateMethodName”). thenReturn (// vrnjena vrednost)
Primer:
when (priceCalculatorSpy, 'isCustomerAnonymous').thenReturn(false);
# 3) Za preverjanje kleščene zasebne metode.
Sintaksa - verifyPrivate (mockedInstance) .invoke (“privateMethodName”)
Primer:
verifyPrivate (priceCalculator).invoke('isCustomerAnonymous');
Popoln testni vzorec: Nadaljujemo z istim primerom iz prejšnjih člankov, kjer ima priceCalculator nekaj zasmehanih odvisnosti, kot so itemService, userService itd.
Ustvarili smo novo metodo, imenovano - CalcuPriceWithPrivateMethod, ki prikliče zasebno metodo znotraj istega razreda in vrne, ali je stranka anonimna ali ne.
@Test @PrepareForTest(PriceCalculator.class) public void calculatePriceForAnonymous_witStubbedPrivateMethod_returnsCorrectPrice() throws Exception { // Arrange ItemSku item1 = new ItemSku(); item1.setApplicableDiscount(5.00); item1.setPrice(100.00); double expectedPrice = 90.00; // Setting up stubbed responses using mocks when(priceCalculatorSpy, 'isCustomerAnonymous').thenReturn(false); when(mockedItemService.getItemDetails(123)).thenReturn(item1); // Act double actualDiscountedPrice = priceCalculatorSpy.calculatePriceWithPrivateMethod(123); // Assert verifyPrivate(priceCalculator).invoke('isCustomerAnonymous'); assertEquals(expectedPrice, actualDiscountedPrice); }
Posmehovanje statičnim metodam
Statične metode se lahko posmehujejo na podoben način, kot smo videli pri zasebnih metodah.
Kadar preskušana metoda vključuje uporabo statične metode iz istega razreda (ali iz drugega razreda), bomo morali ta razred vključiti v opombo PrepaForTest pred preskusom (ali v testnem razredu).
Pomembne točke za lažne statične metode:
# 1) Preskusno metodo ali preskusni razred je treba označiti z @ PrepareForTest (ClassUnderTest). Podobno kot pri posmehovanju zasebnih metod / razredov, je to potrebno tudi za statične razrede.
#two) Dodaten korak, ki je potreben za statične metode, je - mockStatic (// ime statičnega razreda)
Primer:
mockStatic(DiscountCategoryFinder.class)
# 3) Če želite nastaviti statiko na statični metodi, je tako dobro, kot da omamite katero koli metodo na katerem koli drugem lažnem primerku vmesnika / razreda.
Na primer: Če želite stub getDiscountCategory () (ki vrne enum DiscountCategory z vrednostmi PREMIUM & GENERAL) statično metodo razreda DiscountCategoryFinder, preprosto nataknite, kot sledi:
when (DiscountCategoryFinder. getDiscountCategory ()).thenReturn(DiscountCategory. PREMIUM );
# 4) Če želite preveriti lažno nastavitev končne / statične metode, lahko uporabite metodo verifyStatic ().
Primer:
verifyStatic (DiscountCategoryFinder.class, times (1));
Posmehljive metode praznine
Najprej poskusimo razumeti, kakšni primeri uporabe bi lahko vključevali omamljanje praznih metod:
# 1) Na primer klici metode - ta med postopkom pošlje e-poštno obvestilo.
Na primer :Recimo, da spremenite geslo za račun za internetno bančništvo, ko bo sprememba uspešna, boste po e-pošti prejeli obvestilo.
To lahko razumemo kot / changePassword kot klic POST v API banke, ki vključuje klic metode void za pošiljanje e-poštnega obvestila stranki.
#two) Drug pogost primer klica metode void so posodobljene zahteve za DB, ki sprejmejo nekaj vnosa in ne vrnejo ničesar.
Metode zatiranja praznin (tj. Metode, ki ne vrnejo ničesar ali vrnejo izjemo), je mogoče obravnavati z uporabo doNothing (), doThrow () in doAnswer (), doCallRealMethod () funkcije . Zahteva nastavitev škrbine z uporabo zgornjih metod v skladu s pričakovanji testa.
Upoštevajte tudi, da se vsi klici metode void privzeto posmehujejo storiti doNothing (). Torej, tudi če eksplicitna ponarejena nastavitev še ni vklopljena PRAZNO klicev metode, je privzeto vedenje še vedno doNothing ().
Oglejmo si primere za vse te funkcije:
Za vse primere predpostavimo, da obstaja razred StudentScoreUpdates ki ima metodo izračunajSumAndStore (). Ta metoda izračuna vsoto ocen (kot vhod) in pokliče a praznino metoda updateScores () na primerku izvajanja databaseImplementation.
public class StudentScoreUpdates { public IDatabase databaseImpl; public StudentScoreUpdates(IDatabase databaseImpl) { this.databaseImpl = databaseImpl; } public void calculateSumAndStore(String studentId, int() scores) { int total = 0; for(int score : scores) { total = total + score; } // write total to DB databaseImpl.updateScores(studentId, total); } }
Napisali bomo enote za klic ponarejene metode s spodnjimi primeri:
# 1) doNothing () - doNothing () je privzeto vedenje za klice metode void v Mockito, tj. Tudi če preverite klic na način void (brez izrecne nastavitve praznine za doNothing (), bo preverjanje še vedno uspešno)
public void calculateSumAndStore_withValidInput_shouldCalculateAndUpdateResultInDb() { // Arrange studentScores = new StudentScoreUpdates(mockDatabase); int() scores = {60,70,90}; Mockito.doNothing().when(mockDatabase).updateScores(anyString(), anyInt()); // Act studentScores.calculateSumAndStore('student1', scores); // Assert Mockito.verify(mockDatabase, Mockito.times(1)).updateScores(anyString(), anyInt()); }
Druge uporabe skupaj z doNothing ()
do) Ko je metoda void večkrat poklicana in želite nastaviti različne odzive za različne klice, na primer - doNothing () za prvi klic in vrniti izjemo pri naslednjem klicu.
Na primer :Nastavite maketo tako:
Mockito. doNothing ().doThrow(new RuntimeException()).when(mockDatabase).updateScores( anyString (), anyInt ());
b) Ko želite zajeti argumente, s katerimi je bila poklicana metoda void, je treba uporabiti funkcionalnost ArgumentCaptor v Mockitu. To daje dodatno preverjanje argumentov, s katerimi je bila metoda poklicana.
Primer z ArgumentCaptor:
public void calculateSumAndStore_withValidInput_shouldCalculateAndUpdateResultInDb() { // Arrange studentScores = new StudentScoreUpdates(mockDatabase); int() scores = {60,70,90}; Mockito.doNothing().when(mockDatabase).updateScores(anyString(), anyInt()); ArgumentCaptor studentIdArgument = ArgumentCaptor.forClass(String.class); // Act studentScores.calculateSumAndStore('Student1', scores); // Assert Mockito.verify(mockDatabase, Mockito.times(1)).updateScores(studentIdArgument.capture(), anyInt()); assertEquals('Student1', studentIdArgument.getValue()); }
# 2) doThrow ()- To je uporabno, če preprosto želite vrniti izjemo, ko se metoda void prikliče iz preskušane metode.
Na primer:
funkcionalno preskušanje vs nefunkcionalno preskušanje
Mockito.doThrow(newRuntimeException()).when(mockDatabase).updateScores ( anyString (), anyInt ());
# 3) doAnswer ()- doAnswer () preprosto nudi vmesnik za izvajanje neke logike po meri.
Npr. Spreminjanje neke vrednosti s posredovanimi argumenti, vračanje vrednosti / podatkov po meri, ki jih običajni klic ne bi mogel vrniti, zlasti za metode void.
Za namen predstavitve sem potisnil void metodo updateScores (), da vrne » odgovor () «In natisnite vrednost enega od argumentov, ki bi morali biti posredovani, ko bi morala biti metoda poklicana.
Primer kode:
@Test public void calculateSumAndStore_withValidInput_shouldCalculateAndUpdateResultInDb() { // Arrange studentScores = new StudentScoreUpdates(mockDatabaseImpl); int() scores = {60,70,90}; Mockito.doCallRealMethod().when(mockDatabaseImpl).updateScores(anyString(), anyInt()); doAnswer(invocation -> { Object() args = invocation.getArguments(); Object mock = invocation.getMock(); System.out.println(args(0)); return mock; }).when(mockDatabaseImpl).updateScores(anyString(), anyInt()); // Act studentScores.calculateSumAndStore('Student1', scores); // Assert Mockito.verify(mockDatabaseImpl, Mockito.times(1)).updateScores(anyString(), anyInt()); }
# 4) doCallRealMethod ()- Delni posmehi so podobni škrbinam (kjer lahko za nekatere metode pokličete prave metode, preostale pa odstranite).
Za metode void ponuja mockito posebno funkcijo, imenovano doCallRealMethod (), ki jo lahko uporabite, ko poskušate nastaviti maketo. Kaj bo to storilo, pokličite metodo real void z dejanskimi argumenti.
Na primer:
Mockito. doCallRealMethod ().when(mockDatabaseImpl).updateScores( anyString (), anyInt ());
Nasveti in triki
# 1) Vključitev več statičnih razredov v isto preskusno metodo / razred- Uporaba PowerMockito če je treba posmehovati več Static of Final razredov, potem imena razredov v @ PrepareForTest pripis lahko omenimo kot vrednost, ločeno z vejico, kot matriko (v bistvu sprejme matriko imen razredov).
Primer:
@PrepareForTest({PriceCalculator.class, DiscountCategoryFinder.class})
Kot je prikazano v zgornjem primeru, predpostavimo, da sta PriceCalculator in DiscountCategoryFinder končna razreda, ki ju je treba posmehovati. Oboje lahko v pripisu PrepareForTest omenimo kot vrsto razredov in jih v testni metodi nataknemo.
# 2) Pozicioniranje atributa PrepareForTest - Pozicioniranje tega atributa je pomembno glede na vrsto testov, ki so vključeni v razred Test.
Če morajo vsi testi uporabljati isti končni razred, je smiselno omeniti ta atribut na ravni testnega razreda, kar preprosto pomeni, da bo pripravljeni razred na voljo vsem testnim metodam. V nasprotju s tem, če je pripomba omenjena v preskusni metodi, bo na voljo samo določenim preskusom
Zaključek
V tej vadnici smo razpravljali o različnih pristopih za posmehovanje statičnim, končnim in praznim metodam.
Čeprav uporaba veliko statičnih ali končnih metod ovira preizkusnost, kljub temu pa je na voljo podpora za testiranje / posmehovanje, ki pomaga pri ustvarjanju enotnih testov, da bi dosegli večje zaupanje v kodo / aplikacijo tudi za staro kodo, ki se običajno ne uporablja za biti zasnovan za preizkusnost.
Za statične in končne metode Mockito nima neposredne podpore, vendar knjižnice, kot je PowerMockito (ki močno podeduje veliko stvari od Mockita), zagotavljajo takšno podporo in morajo dejansko izvesti manipulacijo bajtkode, da podpirajo te funkcije.
Mockito iz škatle podpira odstranjevanje praznih metod in ponuja različne metode, kot so doNothing, doAnswer, doThrow, doCallRealMethod itd., In se lahko uporablja v skladu z zahtevami testa.
Najpogostejša vprašanja o intervjuju za Mockito so navedena v naslednji vadnici.
PREV Vadnica | NASLEDNJA Vadnica
Priporočeno branje
- Vadnica za Mockito: Mockito Framework za posmeh pri preskušanju enot
- 12 najboljših vprašanj o intervjuju Mockito (posmehljivi okvirni intervju)
- Statično v C ++
- Java niti z metodami in življenjskim ciklom
- Ustvarjanje posmehov in vohunov v Mockitu s primeri kode
- Različne vrste ujemanj, ki jih ponuja Mockito
- Metode in tehnike preprečevanja napak
- Kako uporabljati metode v programu SoapUI za izvajanje preizkusov v velikem obsegu - Vadnica št. 10 za SoapUI