Bespotten van privémethoden met PowerMock

1. Overzicht

Een van de uitdagingen bij het testen van eenheden is het bespotten van privémethoden.

In deze zelfstudie leren we hoe we dit kunnen bereiken door de PowerMock-bibliotheek te gebruiken - die wordt ondersteund door JUnit en TestNG.

PowerMock integreert met mocking-frameworks zoals EasyMock en Mockito en is bedoeld om hieraan extra functionaliteit toe te voegen - zoals het bespotten van privémethoden, laatste klassen en laatste methoden, enz.

Het doet dat door te vertrouwen op bytecode-manipulatie en een volledig aparte classloader.

2. Maven afhankelijkheden

Laten we eerst de vereiste afhankelijkheden toevoegen om PowerMock met Mockito en JUnit in onze pom.xml:

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

De laatste versies zijn hier en hier te bekijken.

3. Voorbeeld

Laten we beginnen met een voorbeeld van een LuckyNumberGenerator. Deze klasse heeft een enkele openbare methode om een ​​geluksgetal te genereren:

public int getLuckyNumber (String naam) {saveIntoDatabase (naam); if (name == null) {return getDefaultLuckyNumber (); } retourneer getComputedLuckyNumber (name.length ()); }

4. Variaties in het bespotten van privémethoden

Om de methode grondig te testen, moeten we privémethoden bespotten.

4.1. Methode zonder argumenten maar met retourwaarde

Laten we als eenvoudig voorbeeld het gedrag van een privémethode zonder argumenten bespotten en deze dwingen de gewenste waarde te retourneren:

LuckyNumberGenerator mock = spy (nieuwe LuckyNumberGenerator ()); when (mock, "getDefaultLuckyNumber"). thenReturn (300); 

In dit geval bespotten we de privémethode getDefaultLuckyNumber en zorg ervoor dat het een waarde van 300 retourneert.

4.2. Methode met argument en retourwaarde

Laten we vervolgens het gedrag van een privémethode bespotten met een argument en deze dwingen de gewenste waarde te retourneren:

LuckyNumberGenerator mock = spy (nieuwe LuckyNumberGenerator ()); doReturn (1) .when (mock, "getComputedLuckyNumber", ArgumentMatchers.anyInt ()); 

In dit geval bespotten we de privémethode en laten we deze terugkeren 1.

Merk op dat het ons niet kan schelen het invoerargument en het gebruik ArgumentMatchers.anyInt () als een jokerteken.

4.3. Verificatie van het aanroepen van een methode

Onze laatste strategie is om PowerMock te gebruiken om de aanroep van een privémethode te verifiëren:

LuckyNumberGenerator mock = spy (nieuwe LuckyNumberGenerator ()); int resultaat = mock.getLuckyNumber ("Tyranosorous"); verifieerPrivate (mock) .invoke ("saveIntoDatabase", ArgumentMatchers.anyString ()); 

5. Een waarschuwing

Ten slotte, hoewel privémethoden kunnen worden getest met PowerMock, we moeten extra voorzichtig zijn bij het gebruik van deze techniek.

Aangezien de bedoeling van onze tests is om het gedrag van een klasse te valideren, moeten we ons onthouden van het veranderen van het interne gedrag van de klasse tijdens het testen van eenheden.

Spottende technieken moeten worden toegepast op de externe afhankelijkheden van de klas en niet op de klas zelf.

Als het bespotten van privémethoden essentieel is voor het testen van onze lessen, duidt dit meestal op een slecht ontwerp.

6. Conclusie

In dit korte artikel hebben we laten zien hoe PowerMock kan worden gebruikt om de mogelijkheden van Mockito voor het bespotten en verifiëren van privémethoden in de geteste klasse uit te breiden.

De broncode van deze tutorial is te vinden op GitHub.


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