Verspotten privater Methoden mit PowerMock

1. Übersicht

Eine der Herausforderungen beim Testen von Einheiten besteht darin, private Methoden zu verspotten.

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

PowerMock lässt sich in Mocking-Frameworks wie EasyMock und Mockito integrieren und soll diesen zusätzliche Funktionen hinzufügen, z. B. das Verspotten privater Methoden, Abschlussklassen und Endmethoden usw.

Dies geschieht durch die Verwendung von Bytecode-Manipulation und einem völlig separaten Klassenladeprogramm.

2. Maven-Abhängigkeiten

Fügen wir zunächst die erforderlichen Abhängigkeiten für die Verwendung von PowerMock mit Mockito und JUnit in unsere pom.xml ein :

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

Die neuesten Versionen können hier und hier überprüft werden.

3. Beispiel

Beginnen wir mit einem Beispiel für einen LuckyNumberGenerator. Diese Klasse hat 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 beim Verspotten privater Methoden

Für umfassende Unit-Tests der Methode müssten 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 Methode getDefaultLuckyNumber und geben einen Wert von 300 zurück.

4.2. Methode mit Argument und Rückgabewert

Als nächstes verspotten wir das Verhalten einer privaten Methode mit einem Argument und zwingen sie, 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 Sie ArgumentMatchers.anyInt () als Platzhalter.

4.3. Überprüfung des Aufrufs einer Methode

Unsere letzte Strategie besteht darin, mit 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 Vorsicht

Obwohl private Methoden mit PowerMock getestet werden können, müssen wir bei der Verwendung dieser Technik besonders vorsichtig sein.

Da die Absicht unserer Tests darin besteht, das Verhalten einer Klasse zu validieren, sollten wir das interne Verhalten der Klasse während des Komponententests nicht ändern.

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

Wenn das Verspotten privater Methoden zum Testen unserer Klassen unerlässlich ist, weist dies normalerweise auf ein schlechtes Design hin.

6. Fazit

In diesem kurzen Artikel haben wir gezeigt, wie PowerMock verwendet werden kann, um die Fähigkeit von Mockito zu erweitern, private Methoden in der getesteten Klasse zu verspotten und zu verifizieren.

Den Quellcode dieses Tutorials finden Sie auf GitHub.