Úvod do PowerMock

1. Prehľad

Testovanie jednotiek pomocou zosmiešňujúceho rámca sa už dlho považuje za užitočnú prax a na tomto trhu v posledných rokoch dominuje najmä rámec Mockito.

A s cieľom uľahčiť slušné návrhy kódov a zjednodušiť verejné API boli niektoré požadované funkcie zámerne vynechané. V niektorých prípadoch však tieto nedostatky nútia testerov napísať ťažkopádny kód, len aby bolo možné vytvoriť falošné kódy.

Tu vstupuje do hry rámec PowerMock.

PowerMockito je rozšírenie PowerMock API na podporu Mockita. Poskytuje možnosti pre prácu s rozhraním Java Reflection API jednoduchým spôsobom na prekonanie problémov s Mockitom, ako je napríklad nedostatok schopnosti predstierať konečné, statické alebo súkromné ​​metódy.

Tento tutoriál poskytne úvod do API PowerMockito a jeho použitia v testoch.

2. Príprava na testovanie pomocou aplikácie PowerMockito

Prvým krokom k integrácii podpory PowerMock pre Mockito je zahrnutie nasledujúcich dvoch závislostí do súboru Maven POM:

 test org.powermock powermock-modul-junit4 1.6.4 test org.powermock powermock-api-mockito 1.6.4 

Ďalej musíme pripraviť naše testovacie prípady na prácu s PowerMockito použitím nasledujúcich dvoch anotácií:

@RunWith (PowerMockRunner.class) @PrepareForTest (fullyQualifiedNames = "com.baeldung.powermockito.introduction. *")

The fullyQualifiedNames prvok v @PrepareForTest anotácia predstavuje pole plne kvalifikovaných mien typov, ktoré sa chceme vysmievať. V takom prípade použijeme na rozpoznanie zástupný znak balíka PowerMockito pripraviť všetky typy v rámci com.baeldung.powermockito.vod balíček na posmech.

Teraz sme pripravení využiť silu PowerMockito.

3. Posmievači a konečné metódy

V tejto časti ukážeme spôsoby, ako získať inštanciu triedy namiesto skutočnej pri vytváraní inštancie triedy pomocou Nový operátor a potom pomocou tohto objektu zosmiešňovať konečnú metódu. Spolupracujúca trieda, ktorej konštruktéri a konečné metódy sa budú vysmievať, je definovaná takto:

verejná trieda CollaboratorWithFinalMethods {verejné finále String helloMethod () {návrat "Hello World!"; }}

Najskôr vytvoríme falošný objekt pomocou PowerMockito API:

CollaboratorWithFinalMethods mock = falošný (CollaboratorWithFinalMethods.class);

Ďalej nastavte očakávanie, ktoré hovorí, že kedykoľvek je vyvolaný konštruktor no-arg tejto triedy, mala by sa vrátiť falošná inštancia, a nie skutočná:

whenNew (CollaboratorWithFinalMethods.class) .withNoArguments (). thenReturn (falošný);

Pozrime sa, ako táto posmešná konštrukcia funguje v akcii CollaboratorWithFinalMethods triedy pomocou svojho predvoleného konštruktora a potom overte správanie PowerMocku:

CollaboratorWithFinalMethods spolupracovník = nový CollaboratorWithFinalMethods (); verifyNew (CollaboratorWithFinalMethods.class) .withNoArguments ();

V ďalšom kroku je očakávanie nastavené na konečnú metódu:

keď (spolupracovník.helloMetóda ()). thenReturn („Ahoj Baeldung!“);

Potom sa vykoná táto metóda:

Reťazec vitajte = spolupracovník.helloMetóda ();

Nasledujúce tvrdenia potvrdzujú, že: ahojMetóda metóda bola volaná na spolupracovník objekt a vráti hodnotu nastavenú podľa posmešného očakávania:

Mockito.verify (spolupracovník). HelloMethod (); assertEquals („Ahoj Baeldung!“, vitajte);

Ak sa chceme vysmievať konkrétnej konečnej metóde namiesto všetkých posledných metód vo vnútri objektu, Mockito.spy (objekt T) metóda môže prísť vhod. Toto je ilustrované v časti 5.

4. Falošné statické metódy

Predpokladajme, že sa chceme vysmievať statickým metódam triedy s názvom CollaboratorWithStaticMethods. Táto trieda je vyhlásená takto:

public class CollaboratorWithStaticMethods {public static String firstMethod (názov reťazca) {return "Hello" + name + "!"; } public static String secondMethod () {return "Ahoj nikto!"; } public static String thirdMethod () {návrat "Ahoj už nikto!"; }}

Aby sme sa mohli posmievať týmto statickým metódam, musíme zaregistrovať priloženú triedu s PowerMockito API:

mockStatic (CollaboratorWithStaticMethods.class);

Prípadne môžeme použiť Mockito.spy (trieda triedy) metóda na zosmiešnenie konkrétneho, ako je demonštrované v nasledujúcej časti.

Ďalej je možné nastaviť očakávania, ktoré definujú hodnoty, ktoré by sa mali metódy vrátiť, keď sú vyvolané:

when (CollaboratorWithStaticMethods.firstMethod (Mockito.anyString ())) .thenReturn ("Hello Baeldung!"); when (CollaboratorWithStaticMethods.secondMethod ()). thenReturn ("Nič zvláštne");

Alebo môže byť nastavená výnimka, ktorá bude vyvolaná pri volaní tretia metóda metóda:

doThrow (new RuntimeException ()). when (CollaboratorWithStaticMethods.class); CollaboratorWithStaticMethods.thirdMethod ();

Teraz je čas na vykonanie prvých dvoch metód:

String firstWelcome = CollaboratorWithStaticMethods.firstMethod ("Ktokoľvek"); Reťazec secondWelcome = CollaboratorWithStaticMethods.firstMethod ("Čokoľvek");

Namiesto volania členom skutočnej triedy sú vyššie uvedené vyvolania delegované na falošné metódy. Nasledujúce tvrdenia dokazujú, že predstieraná platnosť nadobudla:

assertEquals ("Hello Baeldung!", firstWelcome); assertEquals ("Hello Baeldung!", secondWelcome);

Sme tiež schopní overiť správanie falošných metód vrátane toho, koľkokrát je metóda vyvolaná. V takom prípade prvýMetóda bol volaný dvakrát, zatiaľ čo druhá metóda nikdy:

verifyStatic (Mockito.times (2)); CollaboratorWithStaticMethods.firstMethod (Mockito.anyString ()); verifyStatic (Mockito.never ()); CollaboratorWithStaticMethods.secondMethod ();

Poznámka: The verifyStatic metóda musí byť volaná priamo pred akýmkoľvek statickým overením metódy pre PowerMockito vedieť, že je potrebné overiť postupné vyvolanie metódy.

Na záver statická tretia metóda metóda by mala hodiť a RuntimeException ako je uvedené na falošnej predošlej. Je potvrdený očakávané prvok @Test anotácia:

@Test (očakáva sa = RuntimeException.class) public void givenStaticMethods_whenUsingPowerMockito_thenCorrect () {// ďalšie metódy CollaboratorWithStaticMethods.thirdMethod (); }

5. Čiastočné zosmiešňovanie

Namiesto toho, aby sa vysmievali celej triede, PowerMockito API umožňuje posmievať sa jej časti pomocou špión metóda. Nasledujúca trieda sa použije ako spolupracovník na ilustráciu podpory PowerMock pre čiastočné zosmiešňovanie:

verejná trieda CollaboratorForPartialMocking {public static String staticMethod () {return "Hello Baeldung!"; } verejné finále String finalMethod () {návrat "Hello Baeldung!"; } private String privateMethod () {return "Hello Baeldung!"; } public String privateMethodCaller () {return privateMethod () + "Vitajte vo svete Java."; }}

Začnime výsmechom statickej metódy, ktorá je pomenovaná staticMethod vo vyššie uvedenej definícii triedy. Najskôr použite PowerMockito API na čiastočné zosmiešnenie CollaboratorForPartialMocking triedy a nastaviť predpoklad pre svoju statickú metódu:

špión (CollaboratorForPartialMocking.class); when (CollaboratorForPartialMocking.staticMethod ()). thenReturn ("Som statická falošná metóda.");

Potom sa vykoná statická metóda:

returnValue = CollaboratorForPartialMocking.staticMethod ();

Posmešné správanie sa overuje takto:

verifyStatic (); CollaboratorForPartialMocking.staticMethod ();

Nasledujúce tvrdenie potvrdzuje, že simulovaná metóda bola skutočne vyvolaná porovnaním návratovej hodnoty s očakávaním:

assertEquals ("Som statická falošná metóda.", returnValue);

Teraz je čas prejsť na konečnú a súkromnú metódu. Aby sme ilustrovali čiastočné zosmiešňovanie týchto metód, musíme inštanciu triedy vytvoriť a povedať PowerMockito API do špión to:

CollaboratorForPartialMocking spolupracovník = nový CollaboratorForPartialMocking (); CollaboratorForPartialMocking mock = špión (spolupracovník);

Vyššie uvedené objekty sa používajú na demonštráciu zosmiešňovania konečných aj súkromných metód. Teraz sa budeme zaoberať konečnou metódou stanovením očakávania a vyvolaním metódy:

when (mock.finalMethod ()). thenReturn ("Som finálna falošná metóda."); returnValue = mock.finalMethod ();

Chovanie tejto metódy sa čiastočne vysmieva:

Mockito.verify (falošný) .finalMethod ();

Testom sa overuje, že volanie na server konečná metóda metóda vráti hodnotu, ktorá zodpovedá očakávaniu:

assertEquals ("Som finálna falošná metóda.", returnValue);

Podobný postup sa uplatňuje aj pri súkromnej metóde. Hlavný rozdiel je v tom, že túto metódu nemôžeme priamo vyvolať z testovacieho prípadu. Súkromnú metódu majú v zásade zavolať iní z tej istej triedy. V CollaboratorForPartialMocking triedy, súkromná metóda metódy sa má dovolávať privateMethodCaller túto metódu použijeme ako delegáta. Začnime očakávaním a vyvolaním:

when (mock, "privateMethod"). thenReturn ("I am a private mock method."); returnValue = mock.privateMethodCaller ();

Potvrdzuje sa výsmech súkromnej metódy:

verifyPrivate (falošný) .invoke ("privateMethod");

Nasledujúci test zaisťuje, že návratová hodnota z vyvolania súkromnej metódy je rovnaká ako očakávaná hodnota:

assertEquals ("Som súkromná falošná metóda. Vitajte vo svete Java.", returnValue);

6. Záver

Tento tutoriál predstavil úvod do PowerMockito API, ktoré demonštruje jeho použitie pri riešení niektorých problémov, s ktorými sa vývojári stretávajú pri používaní rámca Mockito.

Implementáciu týchto príkladov a útržkov kódu nájdete v prepojenom projekte GitHub.