mocking private static
Naučte sa vysmievať sa súkromným, statickým a neplatným metódam v aplikácii Mockito s príkladmi:
V tejto sérii praktických cvičení Výučné programy o Mockito , pozreli sme sa na rôzne typy Mockito Matcherov v poslednom návode.
Všeobecne povedané, zosmiešňovanie súkromných a statických metód patrí do kategórie neobvyklých zosmiešňovaní.
Ak vznikne potreba vysmievať sa súkromným a statickým metódam / triedam, naznačuje to zle zrefigurovaný kód a nejde v skutočnosti o testovateľný kód a je pravdepodobné, že nejaký starší kód, ktorý nebol zvyknutý, je vhodný na testovanie jednotlivých jednotiek.
Z tohto dôvodu stále existuje podpora pre Mocking súkromné a statické metódy prostredníctvom niekoľkých rámcov na testovanie jednotiek, ako je PowerMockito (a nie priamo od Mockita).
Vysmievanie „neplatných“ metód je bežné, pretože môžu existovať metódy, ktoré v podstate nič nevracajú, napríklad aktualizácia riadku databázy (považujte to za operáciu PUT koncového bodu rozhrania Rest API, ktorá prijíma vstup a nevracia žiadny výstup).
Mockito poskytuje úplnú podporu metódam falošných prázdnin, ktoré si ukážeme na príkladoch v tomto článku.
najkvalitnejší prevodník z youtube na mp3
Čo sa dozviete:
- Powermock - stručný úvod
- Falošné súkromné metódy
- Falošné statické metódy
- Metódy falošnej neplatnosti
- tipy a triky
- Záver
- Odporúčané čítanie
Powermock - Stručný úvod
Pre spoločnosť Mockito neexistuje priama podpora pre falošné súkromné a statické metódy. Ak chcete otestovať súkromné metódy, budete musieť refaktorovať kód zmeniť prístup k chránenému (alebo balíku) a budete sa musieť vyhnúť statickým / konečným metódam.
Mockito, podľa môjho názoru zámerne neposkytuje podporu pre tieto druhy falošných správ, pretože použitie týchto druhov kódových konštruktov je vôňou kódu a zle navrhnutým kódom.
Existujú však rámce, ktoré podporujú zosmiešňovanie súkromných a statických metód.
Powermock rozširuje možnosti ďalších rámcov ako EasyMock a Mockito a poskytuje schopnosť simulovať statické a súkromné metódy.
# 1) Ako: Powermock to robí pomocou vlastnej manipulácie s bytecode, aby podporil posmešné súkromné a statické metódy, konečné triedy, konštruktory atď.
# 2) Podporované balíčky: Powermock poskytuje 2 rozširujúce API - jedno pre Mockito a druhé pre easyMock. V záujme tohto článku budeme písať príklady s rozšírením Mockito pre simulátor napájania.
# 3) Syntax :Powermockito má takmer podobnú syntax ako Mockito, s výnimkou niektorých ďalších metód na zosmiešňovanie statických a súkromných metód.
# 4) Nastavenie Powermockito
Nižšie sú uvedené knižnice, ktoré majú zahrnúť knižnicu Mockito do projektov založených na gradle:
testCompile group: 'org.powermock', name: 'powermock-api-mockito2', version: '1.7.4' testCompile group: 'org.powermock', name: 'powermock-module-junit4', version: '1.7.4'
Podobné závislosti sú k dispozícii aj pre maven.
Powermock-api-mockito2 - Knižnica musí obsahovať rozšírenia Mockito pre Powermockito.
Powermock-modul-junit4 - Modul musí obsahovať PowerMockRunner (čo je vlastný bežec, ktorý sa používa na vykonávanie testov s PowerMockitom).
Tu je dôležité poznamenať, že PowerMock nepodporuje testovacieho bežca Junit5. Preto musia byť testy napísané proti Junit4 a musia byť vykonané pomocou PowerMockRunner.
Ak chcete použiť PowerMockRunner - testovacia trieda musí byť anotovaná @RunWith (PowerMockRunner.class)
Teraz poďme diskutovať a podrobne sa vysmievať súkromným, statickým a neplatným metódam!
Falošné súkromné metódy
Vysmievanie sa súkromným metódam, ktoré sa interne volajú z testovanej metódy, sa v určitých obdobiach nedá vyhnúť. Pomocou programu powermockito je to možné a overenie sa vykonáva pomocou novej metódy s názvom „verifyPrivate“.
Vezmime anPríklad kde testovaná metóda volá súkromnú metódu (ktorá vracia logickú hodnotu). Aby sme tejto metóde vrátili hodnotu true / false v závislosti od testu, je potrebné v tejto triede nastaviť pahýl.
V tomto príklade je testovaná trieda vytvorená ako špionážna inštancia so zosmiešňovaním niekoľkých vyvolaných rozhraní a vyvolaných súkromných metód.
Dôležité body pre Mock Private Method:
# 1) Skúšobná metóda alebo skúšobná trieda musí byť anotovaná znakom @ PrepareForTest (ClassUnderTest). Táto anotácia hovorí programu PowerMockito, aby pripravil určité triedy na testovanie.
Budú to väčšinou tie triedy, ktoré musia byť Bytecode manipulate . Typicky pre záverečné triedy, triedy obsahujúce súkromné alebo statické metódy, ktoré sa musia vysmievať počas testovania.
Príklad:
@PrepareForTest(PriceCalculator.class)
#dva) Ak chcete nastaviť stub na súkromnú metódu.
Syntax - keď (simulovaná alebo špionážna inštancia, „privateMethodName“). thenReturn (// návratová hodnota)
Príklad:
when (priceCalculatorSpy, 'isCustomerAnonymous').thenReturn(false);
# 3) Na overenie utajenej súkromnej metódy.
Syntax - verifyPrivate (mockedInstance) .invoke („privateMethodName“)
Príklad:
verifyPrivate (priceCalculator).invoke('isCustomerAnonymous');
Kompletná skúšobná vzorka: Pokračujeme v rovnakom príklade z predchádzajúcich článkov, kde má priceCalculator zosmiešňované závislosti ako itemService, userService atď.
Vytvorili sme novú metódu nazvanú - CalculatePriceWithPrivateMethod, ktorá zavolá súkromnú metódu v rámci tej istej triedy a vráti, či je zákazník anonymný alebo nie.
@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); }
Falošné statické metódy
Statické metódy je možné zosmiešňovať podobným spôsobom, aký sme videli pre súkromné metódy.
Keď testovaná metóda zahŕňa použitie statickej metódy z tej istej triedy (alebo z inej triedy), budeme ju musieť zahrnúť do anotácie PreparForTest pred testom (alebo na testovacej triede).
Dôležité body k simulovaným statickým metódam:
# 1) Skúšobná metóda alebo skúšobná trieda musí byť anotovaná znakom @ PrepareForTest (ClassUnderTest). Podobne ako pri zosmiešňovaní súkromných metód / tried sa to vyžaduje aj pre statické triedy.
#dva) Jeden ďalší krok, ktorý je potrebný pri statických metódach, je - mockStatic (// názov statickej triedy)
Príklad:
mockStatic(DiscountCategoryFinder.class)
# 3) Nastaviť pahýl na statickú metódu je rovnako dobré ako pichnúť ktorúkoľvek metódu na iných simulovaných inštanciách rozhrania / triedy.
Napríklad: Ak chcete získať stD getDiscountCategory () (ktorá vracia výčet DiscountCategory s hodnotami PREMIUM & GENERAL) statickú metódu triedy DiscountCategoryFinder, jednoducho urobte stub nasledovne:
when (DiscountCategoryFinder. getDiscountCategory ()).thenReturn(DiscountCategory. PREMIUM );
# 4) Na overenie falošného nastavenia finálnej / statickej metódy je možné použiť metódu verifyStatic ().
Príklad:
verifyStatic (DiscountCategoryFinder.class, times (1));
Metódy falošnej neplatnosti
Najprv sa pokúsime pochopiť, aký druh prípadov použitia môže zahŕňať metódy zneplatnenia neplatných:
# 1) Napríklad telefonické hovory metódou - ktoré počas procesu odosiela e-mailové upozornenie.
Napríklad :Predpokladajme, že si zmeníte heslo pre svoj účet internetového bankovníctva, akonáhle bude zmena úspešná, dostanete upozornenie prostredníctvom e-mailu.
Toto možno považovať za / changePassword ako volanie POST do rozhrania Bank API, ktoré obsahuje volanie metódy void na odoslanie e-mailovej notifikácie zákazníkovi.
#dva) Ďalším bežným príkladom volania metódy void sú aktualizované požiadavky do DB, ktoré prijímajú určitý vstup a nič nevracajú.
Metódy stubbing void (t. J. Metódy, ktoré nič nevracajú, alebo inak vyvolávajú výnimku), je možné vyriešiť pomocou funkcie doNothing (), doThrow () a doAnswer (), doCallRealMethod () . Vyžaduje sa nastavenie pahýľa pomocou vyššie uvedených metód podľa očakávaní testu.
Upozorňujeme tiež, že všetky volania metódou void sú predvolene vysmievané funkcii doNothing (). Preto, aj keď nie je vykonané explicitné falošné nastavenie NEPLATNÝ volania metód, predvolené správanie je stále robiť doNothing ().
Pozrime sa na príklady všetkých týchto funkcií:
Pri všetkých príkladoch predpokladajme, že existuje trieda StudentScoreUpdates ktorá má metódu CalcSumAndStore (). Táto metóda počíta súčet skóre (ako vstup) a volá a neplatný metóda updateScores () na inštancii 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); } }
Budeme písať jednotkové testy pre simulované volanie metódy s nasledujúcimi príkladmi:
# 1) doNothing () - doNothing () je predvolené správanie pre void metódy volania v Mockito, t. J. Aj keď overíte volanie metódy void (bez výslovného nastavenia void na doNothing (), overenie bude stále úspešné)
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()); }
Iné použitia spolu s doNothing ()
do) Keď sa metóda void volá viackrát a chcete nastaviť rôzne odpovede pre rôzne vyvolania, napríklad - doNothing () pre prvé vyvolanie a na ďalšie vyvolanie urobte výnimku.
Napríklad :Falošne nastaviť takto:
Mockito. doNothing ().doThrow(new RuntimeException()).when(mockDatabase).updateScores( anyString (), anyInt ());
b) Ak chcete zachytiť argumenty, pomocou ktorých bola volaná metóda void, mala by sa použiť funkcia ArgumentCaptor v aplikácii Mockito. Toto poskytuje ďalšie overenie argumentov, pomocou ktorých bola metóda vyvolaná.
Príklad s 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 užitočné, keď chcete jednoducho vyvolať výnimku, keď je metóda void vyvolaná z testovanej metódy.
Napríklad:
Mockito.doThrow(newRuntimeException()).when(mockDatabase).updateScores ( anyString (), anyInt ());
# 3) doAnswer ()- doAnswer () jednoducho poskytuje rozhranie na vykonávanie vlastnej logiky.
Napr. Úprava určitej hodnoty pomocou zadaných argumentov, vrátenie vlastných hodnôt / údajov, ktoré bežný stub nemohol vrátiť, najmä pre metódy void.
Na účely demonštrácie - odstránil som metódu updateScores () void „ odpoveď () ”A vytlačiť hodnotu jedného z argumentov, ktoré mali byť odovzdané pri vyvolaní metódy.
Príklad kódu:
@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 ()- Čiastočné falošné správy sú podobné stubom (kde môžete pre niektoré metódy zavolať skutočné metódy a zvyšok vyradiť).
Pre metódy neplatnosti poskytuje mockito špeciálnu funkciu nazvanú doCallRealMethod (), ktorú je možné použiť, keď sa pokúšate nastaviť falošnú správu. Čo to urobí, je zavolať metódu skutočnej prázdnoty so skutočnými argumentmi.
Napríklad:
Mockito. doCallRealMethod ().when(mockDatabaseImpl).updateScores( anyString (), anyInt ());
tipy a triky
# 1) Zahrnutie viacerých statických tried do jednej testovacej metódy / triedy- Používanie PowerMockito ak je potrebné zosmiešniť viac tried Static of Final, potom názvy tried v @ PrepareForTest anotáciu možno uviesť ako hodnotu oddelenú čiarkami ako pole (v zásade akceptuje pole s názvami tried).
Príklad:
@PrepareForTest({PriceCalculator.class, DiscountCategoryFinder.class})
Ako je uvedené v príklade vyššie, predpokladajme, že PriceCalculator aj DiscountCategoryFinder sú záverečné triedy, ktoré je potrebné zosmiešňovať. Oba z nich možno spomenúť ako pole tried v anotácii PrepareForTest a je možné ich zaviesť do testovacej metódy.
# 2) PrepareForTest atribút Umiestnenie - Umiestnenie tohto atribútu je dôležité z hľadiska druhu testov, ktoré sú zahrnuté v testovacej triede.
Ak je pri všetkých testoch potrebné použiť rovnakú výslednú triedu, je rozumné spomenúť tento atribút na úrovni testovacej triedy, čo znamená, že pripravená trieda bude k dispozícii pre všetky testovacie metódy. Na rozdiel od toho, ak je anotácia uvedená v testovacej metóde, bude k dispozícii iba pre dané konkrétne testy
Záver
V tomto tutoriáli sme diskutovali o rôznych prístupoch k simulovaným statickým, konečným a neplatným metódam.
čo sú metadáta v dátovom sklade
Aj keď použitie mnohých statických alebo konečných metód bráni testovateľnosti, stále existuje podpora pre testovanie / posmievanie, ktorá pomáha pri vytváraní jednotkových testov s cieľom dosiahnuť väčšiu dôveru v kód / aplikáciu aj pre starší kód, na ktorý sa zvyčajne nepoužíva. byť navrhnuté na skúšanie.
Pre statické a finálne metódy Mockito nemá podporu priamo z krabice, ale knižnice ako PowerMockito (ktoré vo veľkej miere dedia veľa vecí od Mockita) takúto podporu poskytujú a na podporu týchto funkcií musí skutočne vykonávať manipuláciu s bytecode.
Mockito po vybalení z krabice podporuje metódy stubbing void a poskytuje rôzne metódy ako doNothing, doAnswer, doThrow, doCallRealMethod atď. A môže byť použité podľa požiadaviek testu.
Najčastejšie otázky týkajúce sa rozhovorov s programom Mockito sú uvedené v našom ďalšom návode.
Výukový program PREV | NEXT Tutorial
Odporúčané čítanie
- Výukový program Mockito: Rámec Mockito pre simuláciu pri testovaní jednotiek
- 12 najčastejších otázok týkajúcich sa rozhovorov (modelový rozhovor)
- Statické v C ++
- Vlákna Java s metódami a životným cyklom
- Vytváranie simulátorov a špiónov v simulátore s príkladmi kódu
- Rôzne typy zápaliek, ktoré poskytuje Mockito
- Metódy a techniky prevencie defektov
- Ako používať metódy v SoapUI na hromadné vykonávanie testu - SoapUI Tutorial # 10