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.


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