Java >> Java tutorial >  >> Tag >> private

Hån mod private metoder ved hjælp af PowerMock

1. Oversigt

En af udfordringerne ved enhedstestning er at håne private metoder.

I denne vejledning lærer vi om, hvordan vi kan opnå dette ved at bruge PowerMock-biblioteket – som understøttes af JUnit og TestNG.

PowerMock integreres med hånende rammer som EasyMock og Mockito og er beregnet til at tilføje yderligere funktionalitet til disse – såsom at håne private metoder, afsluttende klasser og endelige metoder, osv.

Det gør den ved at stole på bytekode-manipulation og en helt separat klasseindlæser.

2. Maven Dependencies

Lad os først tilføje nødvendige afhængigheder for at bruge PowerMock med Mockito og JUnit til vores pom.xml :

<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-module-junit4</artifactId>
    <version>1.7.3</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-api-mockito2</artifactId>
    <version>1.7.3</version>
    <scope>test</scope>
</dependency>

De seneste versioner kan tjekkes her og her.

3. Eksempel

Lad os komme i gang med et eksempel på en LuckyNumberGenerator. Denne klasse har en enkelt offentlig metode til at generere et lykketal:

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

4. Variationer i hån mod private metoder

For udtømmende enhedstestning af metoden er vi nødt til at håne private metoder.

4.1. Metode uden argumenter, men med returværdi

Som et simpelt eksempel, lad os håne adfærden af ​​en privat metode uden argumenter og tvinge den til at returnere den ønskede værdi:

LuckyNumberGenerator mock = spy(new LuckyNumberGenerator());

when(mock, "getDefaultLuckyNumber").thenReturn(300);

I dette tilfælde håner vi den private metode getDefaultLuckyNumber og få det til at returnere en værdi på 300.

4.2. Metode med argument og returværdi

Lad os derefter håne adfærden af ​​en privat metode med et argument og tvinge den til at returnere den ønskede værdi:

LuckyNumberGenerator mock = spy(new LuckyNumberGenerator());

doReturn(1).when(mock, "getComputedLuckyNumber", ArgumentMatchers.anyInt());

I dette tilfælde håner vi den private metode og får den til at returnere 1.

Bemærk, at vi er ligeglade med input-argumentet og brug ArgumentMatchers.anyInt() som jokertegn.

4.3. Verifikation af påkaldelse af en metode

Vores endelige strategi er at bruge PowerMock til at bekræfte påkaldelsen af ​​en privat metode:

LuckyNumberGenerator mock = spy(new LuckyNumberGenerator());
int result = mock.getLuckyNumber("Tyranosorous");

verifyPrivate(mock).invoke("saveIntoDatabase", ArgumentMatchers.anyString());

5. Et advarselsord

Endelig, selvom private metoder kan testes ved hjælp af PowerMock, skal vi være ekstra forsigtige, når vi bruger denne teknik.

Da hensigten med vores test er at validere en klasses adfærd, bør vi afstå fra at ændre klassens interne adfærd under enhedstestning.

Hånende teknikker bør anvendes på klassens eksterne afhængigheder og ikke på selve klassen.

Hvis hån mod private metoder er afgørende for at teste vores klasser, indikerer det normalt et dårligt design.

6. Konklusion

I denne hurtige artikel viste vi, hvordan PowerMock kunne bruges til at udvide Mockitos evne til at håne og verificere private metoder i klassen under test.

Kildekoden til denne tutorial kan findes på GitHub.


Java tag