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.