Ismijavanje privatnih metoda korištenjem PowerMocka

1. Pregled

Jedan od izazova jedinstvenog testiranja je ruganje privatnim metodama.

U ovom uputstvu naučit ćemo kako to možemo postići pomoću knjižnice PowerMock - koju podržavaju JUnit i TestNG.

PowerMock se integrira s podsmiješnim okvirima poput EasyMock-a i Mockito-a i ima za cilj dodati im dodatne funkcije - poput ruganja privatnim metodama, završnim klasama i završnim metodama itd.

To čini oslanjajući se na manipulaciju bajt kodom i potpuno zaseban učitavač klasa.

2. Ovisnosti Mavena

Prvo, dodajmo potrebne ovisnosti za upotrebu PowerMocka s Mockitom i JUnitom u našu pom.xml:

 test org.powermock powermock-module-junit4 1.7.3 test org.powermock powermock-api-mockito2 1.7.3 test 

Najnovije verzije možete provjeriti ovdje i ovdje.

3. Primjer

Krenimo s primjerom a LuckyNumberGenerator. Ova klasa ima jednu javnu metodu za generiranje sretnog broja:

javni int getLuckyNumber (naziv niza) {saveIntoDatabase (ime); if (name == null) {return getDefaultLuckyNumber (); } return getComputedLuckyNumber (name.length ()); }

4. Varijacije u ruganju privatnim metodama

Za iscrpno jedinstveno testiranje metode, trebali bismo se rugati privatnim metodama.

4.1. Metoda bez argumenata, ali s povratnom vrijednošću

Kao jednostavan primjer, ismijajmo ponašanje privatne metode bez argumenata i prisilimo je da vrati željenu vrijednost:

LuckyNumberGenerator mock = špijun (novi LuckyNumberGenerator ()); kada (mock, "getDefaultLuckyNumber"). thenReturn (300); 

U ovom se slučaju rugamo privatnoj metodi getDefaultLuckyNumber i neka vrati vrijednost od 300.

4.2. Metoda s argumentom i povratnom vrijednošću

Dalje, ismijajmo ponašanje privatne metode argumentom i prisilimo je da vrati željenu vrijednost:

LuckyNumberGenerator mock = špijun (novi LuckyNumberGenerator ()); doReturn (1) .when (mock, "getComputedLuckyNumber", ArgumentMatchers.anyInt ()); 

U ovom se slučaju rugamo privatnoj metodi i vraćamo je 1.

Primijetite da nas nije briga za ulazni argument i upotrebu ArgumentMatchers.anyInt () kao zamjenski znak.

4.3. Provjera pozivanja metode

Naša konačna strategija je korištenje PowerMocka za provjeru poziva privatne metode:

LuckyNumberGenerator mock = špijun (novi LuckyNumberGenerator ()); int rezultat = mock.getLuckyNumber ("Tyranosorous"); verifyPrivate (mock) .invoke ("saveIntoDatabase", ArgumentMatchers.anyString ()); 

5. Riječ opreza

Napokon, iako se privatne metode mogu testirati pomoću PowerMocka, moramo biti izuzetno oprezni dok koristimo ovu tehniku.

S obzirom na to da je namjera našeg testiranja potvrditi ponašanje klase, trebali bismo se suzdržati od promjene unutarnjeg ponašanja klase tijekom jedinstvenog testiranja.

Tehnike izrugivanja treba primijeniti na vanjske ovisnosti klase, a ne na samu klasu.

Ako je ismijavanje privatnih metoda neophodno za testiranje naših predavanja, to obično ukazuje na loš dizajn.

6. Zaključak

U ovom kratkom članku pokazali smo kako se PowerMock može koristiti za proširivanje mogućnosti Mockita za ruganje i provjeru privatnih metoda u klasi koja se ispituje.

Izvorni kod ovog vodiča možete pronaći na GitHubu.


$config[zx-auto] not found$config[zx-overlay] not found