Spott av private metoder ved bruk av PowerMock
1. Oversikt
En av utfordringene med enhetstesting er å spotte private metoder.
I denne opplæringen lærer vi om hvordan vi kan oppnå dette ved å bruke PowerMock-biblioteket - som støttes av JUnit og TestNG.
PowerMock integreres med mocking-rammeverk som EasyMock og Mockito og er ment å legge til ekstra funksjonalitet til disse - for eksempel mocking private metoder, avsluttende klasser og endelige metoder, etc.
Det gjør det ved å stole på manipulering av bytecode og en helt egen klasselaster.
2. Maven-avhengigheter
La oss først legge til nødvendige avhengigheter for å bruke PowerMock med Mockito og JUnit i vår pom.xml:
org.powermock powermock-module-junit4 1.7.3 test org.powermock powermock-api-mockito2 1.7.3 test
De siste versjonene kan sjekkes her og her.
3. Eksempel
La oss komme i gang med et eksempel på en LuckyNumberGenerator. Denne klassen har en enkelt offentlig metode for å generere et heldig tall:
public int getLuckyNumber (String name) {saveIntoDatabase (name); if (name == null) {return getDefaultLuckyNumber (); } returner getComputedLuckyNumber (name.length ()); }
4. Variasjoner i spott av private metoder
For uttømmende enhetstesting av metoden, trenger vi å spotte private metoder.
4.1. Metode uten argumenter, men med returverdi
Som et enkelt eksempel, la oss spotte oppførselen til en privat metode uten argumenter og tvinge den til å returnere ønsket verdi:
LuckyNumberGenerator mock = spion (ny LuckyNumberGenerator ()); når (mock, "getDefaultLuckyNumber"). deretter Retur (300);
I dette tilfellet håner vi den private metoden getDefaultLuckyNumber og få den til å returnere en verdi på 300.
4.2. Metode med argument og returverdi
Deretter la oss spotte oppførselen til en privat metode med et argument og tvinge den til å returnere ønsket verdi:
LuckyNumberGenerator mock = spion (ny LuckyNumberGenerator ()); doReturn (1) .when (mock, "getComputedLuckyNumber", ArgumentMatchers.anyInt ());
I dette tilfellet håner vi den private metoden og får den til å returnere 1.
Legg merke til at vi ikke bryr oss om inngangsargumentet og bruken ArgumentMatchers.anyInt () som et jokertegn.
4.3. Verifisering av påkallelse av en metode
Vår endelige strategi er å bruke PowerMock for å verifisere påkallelse av en privat metode:
LuckyNumberGenerator mock = spion (ny LuckyNumberGenerator ()); int resultat = mock.getLuckyNumber ("Tyranosorous"); verifyPrivate (mock) .invoke ("saveIntoDatabase", ArgumentMatchers.anyString ());
5. Et ord med forsiktighet
Til slutt, selv om private metoder kan testes ved hjelp av PowerMock, vi må være ekstra forsiktige når vi bruker denne teknikken.
Gitt intensjonen med testingen vår er å validere oppførselen til en klasse, bør vi avstå fra å endre den interne oppførselen til klassen under enhetstesting.
Spottteknikker bør brukes på klassens eksterne avhengigheter og ikke på klassen selv.
Hvis det er viktig å spotte med private metoder for å teste klassene våre, indikerer det vanligvis en dårlig design.
6. Konklusjon
I denne raske artikkelen viste vi hvordan PowerMock kunne brukes til å utvide muligheten til Mockito for hån og verifisering av private metoder i klassen som testes.
Kildekoden til denne veiledningen finner du på GitHub.