Uvod u PowerMock

1. Pregled

Jedinstveno testiranje uz pomoć podsmiješnog okvira odavno je prepoznato kao korisna praksa, a Mockito okvir je posljednjih godina dominirao na ovom tržištu.

A kako bi se olakšalo pristojno dizajniranje koda i javni API bio jednostavan, neke su željene značajke namjerno izostavljene. Međutim, u nekim slučajevima ti nedostaci prisiljavaju testere da napišu glomazan kôd samo kako bi stvaranje izrugivanja bilo izvedivo.

Tu se pojavljuje PowerMock framework.

PowerMockito API je PowerMock-ovog proširenja za podršku Mockitu. Pruža mogućnosti za rad s API-jem Java Reflection na jednostavan način za prevladavanje Mockitovih problema, poput nedostatka mogućnosti ismijavanja konačnih, statičkih ili privatnih metoda.

Ovaj će vodič dati uvod u PowerMockito API i kako se primjenjuje u testovima.

2. Priprema za testiranje pomoću PowerMockita

Prvi korak za integriranje podrške za PowerMock za Mockito jest uključivanje sljedeće dvije ovisnosti u datoteku Maven POM:

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

Dalje, moramo pripremiti naše test slučajeve za rad PowerMockito primjenom sljedeće dvije bilješke:

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

The potpunoKvalificirana imena element u @PrepareForTest napomena predstavlja niz potpuno kvalificiranih imena tipova kojima se želimo rugati. U tom slučaju koristimo naziv paketa s zamjenskim znakom PowerMockito za pripremu svih vrsta unutar com.baeldung.powermockito.introduction paket za ruganje.

Sada smo spremni iskoristiti snagu PowerMockito.

3. Izrugivanje konstruktora i konačne metode

U ovom ćemo odjeljku demonstrirati načine dobivanja lažne instance umjesto stvarne prilikom instanciranja klase s novi , a zatim se tim objektom rugaju konačnoj metodi. Klasa koja surađuje, čiji će se konstruktori i konačne metode ismijavati, definirana je kako slijedi:

javna klasa CollaboratorWithFinalMethods {public final String helloMethod () {return "Hello World!"; }}

Prvo kreiramo lažni objekt pomoću PowerMockito API:

CollaboratorWithFinalMethods mock = mock (CollaboratorWithFinalMethods.class);

Dalje, postavite očekivanje rekavši da kad god se pozove konstruktor no-arg te klase, mora se vratiti lažna instanca, a ne stvarna:

whenNew (CollaboratorWithFinalMethods.class) .withNoArguments (). thenReturn (lažno);

Pogledajmo kako ovo građevinsko ismijavanje djeluje na akciji instanciranjem CollaboratorWithFinalMethods klase koristeći zadani konstruktor, a zatim provjerite ponašanje PowerMocka:

CollaboratorWithFinalMethods suradnik = new CollaboratorWithFinalMethods (); verifyNew (CollaboratorWithFinalMethods.class) .withNoArguments ();

U sljedećem se koraku očekivanje postavlja na konačnu metodu:

kada (suradnik.helloMethod ()). thenReturn ("Pozdrav Baeldung!");

Zatim se izvršava ova metoda:

Niz dobrodošlice = suradnik.helloMethod ();

Sljedeće tvrdnje potvrđuju da je pozdravMetoda metoda je pozvana na suradnik objekt i vraća vrijednost postavljenu podrugljivim očekivanjem:

Mockito.verify (suradnik) .helloMethod (); assertEquals ("Pozdrav Baeldung!", dobrodošli);

Ako se želimo rugati određenoj konačnoj metodi, a ne svim konačnim unutar objekta, Mockito.spy (T objekt) metoda može dobro doći. To je ilustrirano u odjeljku 5.

4. Ismijavanje statičkih metoda

Pretpostavimo da se želimo rugati statičkim metodama klase imenovane CollaboratorWithStaticMethods. Ova je klasa deklarirana na sljedeći način:

javna klasa CollaboratorWithStaticMethods {javni statički String firstMethod (naziv niza) {return "Hello" + name + "!"; } public static String secondMethod () {return "Pozdrav nikome!"; } public static String thirdMethod () {return "Pozdrav više nitko!"; }}

Da bismo se rugali ovim statičkim metodama, moramo registrirati priloženu klasu s PowerMockito API:

mockStatic (CollaboratorWithStaticMethods.class);

Alternativno, možemo koristiti Mockito.spy (razredna nastava) metoda za ismijavanje određene, kao što je prikazano u sljedećem odjeljku.

Dalje, mogu se postaviti očekivanja kako bi se definirale vrijednosti koje bi metode trebale vratiti kada se pozovu:

when (CollaboratorWithStaticMethods.firstMethod (Mockito.anyString ())). thenReturn ("Hello Baeldung!"); when (CollaboratorWithStaticMethods.secondMethod ()). thenReturn ("Ništa posebno");

Ili se može postaviti iznimka koja će se aktivirati prilikom poziva trećaMetoda metoda:

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

Sada je vrijeme za izvršavanje prve dvije metode:

String firstWelcome = CollaboratorWithStaticMethods.firstMethod ("Tko god"); Niz secondWelcome = CollaboratorWithStaticMethods.firstMethod ("Što god");

Umjesto pozivanja članova stvarne klase, gornji pozivi delegiraju se na lažne metode. Sljedeće tvrdnje dokazuju da je lažno predstavljanje stupilo na snagu:

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

Također smo u mogućnosti provjeriti ponašanje lažnih metoda, uključujući broj puta poziva metode. U ovom slučaju, firstMethod je pozvan dva puta, dok je secondMethod nikada:

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

Bilješka: The verifyStatic metoda mora biti pozvana neposredno prije bilo kakve statičke provjere metode za PowerMockito znati da je uzastopno pozivanje metode ono što treba provjeriti.

Na kraju, statički trećaMetoda metoda treba baciti a RuntimeException kao što je prethodno izjavljeno. Potvrđuje ga očekivano element @Test napomena:

@Test (očekuje se = RuntimeException.class) javna praznina givenStaticMethods_whenUsingPowerMockito_thenCorrect () {// ostale metode CollaboratorWithStaticMethods.thirdMethod (); }

5. Djelomično ruganje

Umjesto da se ruga cijelom razredu, PowerMockito API omogućuje ruganje dijela s pomoću špijun metoda. Sljedeća klasa će se koristiti kao suradnik za ilustraciju podrške PowerMock za djelomično ruganje:

javna klasa CollaboratorForPartialMocking {javni statički niz staticMethod () {return "Pozdrav Baeldung!"; } public final String finalMethod () {return "Pozdrav Baeldung!"; } private String privateMethod () {return "Pozdrav Baeldung!"; } javni niz privateMethodCaller () {return privateMethod () + "Dobrodošli u svijet Jave."; }}

Počnimo s ismijavanjem statičke metode koja je nazvana staticMethod u gornjoj definiciji klase. Prvo upotrijebite PowerMockito API za djelomično ismijavanje Suradnik zaPartialMocking klase i postavite očekivanje za njegovu statičku metodu:

špijun (CollaboratorForPartialMocking.class); when (CollaboratorForPartialMocking.staticMethod ()). thenReturn ("Ja sam statična lažna metoda.");

Zatim se izvršava statička metoda:

returnValue = CollaboratorForPartialMocking.staticMethod ();

Podrugljivo ponašanje provjerava se na sljedeći način:

verifyStatic (); CollaboratorForPartialMocking.staticMethod ();

Sljedeća tvrdnja potvrđuje da je lažna metoda zapravo pozvana uspoređivanjem povratne vrijednosti u odnosu na očekivanje:

assertEquals ("Ja sam statična lažna metoda.", returnValue);

Sada je vrijeme da prijeđemo na konačnu i privatnu metodu. Da bismo ilustrirali djelomično ruganje tim metodama, moramo instancirati klasu i reći PowerMockito API za špijun to:

CollaboratorForPartialMocking suradnik = novi CollaboratorForPartialMocking (); CollaboratorForPartialMocking mock = špijun (suradnik);

Gore stvoreni objekti koriste se za demonstraciju ismijavanja konačne i privatne metode. Sada ćemo se pozabaviti konačnom metodom postavljanjem očekivanja i pozvat ćemo metodu:

when (mock.finalMethod ()). thenReturn ("Ja sam konačna lažna metoda."); returnValue = mock.finalMethod ();

Dokazano je ponašanje djelomičnog ruganja toj metodi:

Mockito.verify (mock) .finalMethod ();

Test potvrđuje da je pozivanje finalMethod metoda će vratiti vrijednost koja odgovara očekivanjima:

assertEquals ("Ja sam konačna lažna metoda.", returnValue);

Sličan postupak primjenjuje se i na privatnu metodu. Glavna je razlika u tome što se na ovu metodu ne možemo izravno pozvati iz testnog slučaja. U osnovi, privatnu metodu trebaju pozvati drugi iz iste klase. U Suradnik zaPartialMocking razred, privateMethod metoda treba pozvati privateMethodCaller metodu i potonjeg ćemo koristiti kao delegat. Krenimo od očekivanja i zazivanja:

when (mock, "privateMethod"). thenReturn ("Ja sam privatna lažna metoda."); returnValue = mock.privateMethodCaller ();

Potvrđuje se ruganje privatnoj metodi:

verifyPrivate (mock) .invoke ("privateMethod");

Sljedeći test osigurava da je povratna vrijednost iz pozivanja privatne metode jednaka očekivanju:

assertEquals ("Ja sam privatna lažna metoda. Dobrodošli u svijet Jave.", returnValue);

6. Zaključak

Ovaj je vodič pružio uvod u PowerMockito API, pokazujući njegovu upotrebu u rješavanju nekih problema s kojima se programeri susreću kada koriste Mockito framework.

Provedba ovih primjera i isječaka koda mogu se naći u povezanom projektu GitHub.