Verspottung privater Methoden mit PowerMock

Verspotten von privaten Methoden mit PowerMock

1. Überblick

Eine der Herausforderungen bei Unit-Tests ist das Verspotten privater Methoden.

In diesem Tutorial erfahren Sie, wie Sie dies mithilfe derPowerMock-Bibliothek erreichen können, die von JUnit und TestNG unterstützt wird.

PowerMock integrates with mocking frameworks like EasyMock and Mockito and is meant to add additional functionality to these – such as mocking private methods, final classes, and final methods, usw.

Dies geschieht durch die Verwendung der Bytecode-Manipulation und eines völlig separaten Klassenladeprogramms.

2. Maven-Abhängigkeiten

Fügen wir zunächst die erforderlichen Abhängigkeiten für die Verwendung von PowerMock mit Mockito und JUnit zu unserenpom.xmlhinzu:


    org.powermock
    powermock-module-junit4
    1.7.3
    test


    org.powermock
    powermock-api-mockito2
    1.7.3
    test

Die neuesten Versionen könnenhere undhere überprüft werden.

3. Beispiel

Beginnen wir mit einem Beispiel fürLuckyNumberGenerator.. Diese Klasse verfügt über eine einzige öffentliche Methode zum Generieren einer Glückszahl:

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

4. Variationen in der Verspottung privater Methoden

Für umfassende Unit-Tests der Methode müssen wir private Methoden verspotten.

4.1. Methode ohne Argumente, aber mit Rückgabewert

Lassen Sie uns als einfaches Beispiel das Verhalten einer privaten Methode ohne Argumente verspotten und sie zwingen, den gewünschten Wert zurückzugeben:

LuckyNumberGenerator mock = spy(new LuckyNumberGenerator());

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

In diesem Fall verspotten wir die private MethodegetDefaultLuckyNumber und lassen sie einen Wert von 300 zurückgeben.

4.2. Methode mit Argument und Rückgabewert

Lassen Sie uns als Nächstes das Verhalten einer privaten Methode mit einem Argument verspotten und sie zwingen, den gewünschten Wert zurückzugeben:

LuckyNumberGenerator mock = spy(new LuckyNumberGenerator());

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

In diesem Fall verspotten wir die private Methode und lassen sie 1 zurückgeben.

Beachten Sie, dass uns das Eingabeargument egal ist und verwenden SieArgumentMatchers.anyInt() als Platzhalter.

4.3. Überprüfung des Aufrufs einer Methode

Unsere letzte Strategie besteht darin, mithilfe von PowerMock den Aufruf einer privaten Methode zu überprüfen:

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

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

5. Ein Wort der Warnung

Obwohl private Methoden mit PowerMock getestet werden können, istwe must be extra cautious while using this technique.

In Anbetracht der Absicht unserer Tests, das Verhalten einer Klasse zu validieren, sollten wir es unterlassen, das interne Verhalten der Klasse während der Komponententests zu ändern.

Verspottungstechniken sollten auf die externen Abhängigkeiten der Klasse und nicht auf die Klasse selbst angewendet werden.

Wenn das Verspotten privater Methoden für das Testen unserer Klassen unerlässlich ist, deutet dies normalerweise auf ein schlechtes Design hin.

6. Fazit

In diesem kurzen Artikel wurde gezeigt, wie PowerMock verwendet werden kann, um die Fähigkeit von Mockito zum Verspotten und Überprüfen privater Methoden in der getesteten Klasse zu erweitern.

Der Quellcode dieses Tutorials befindet sich inover on GitHub.