PowerMock
PowerMock ist ein Java-Framework, zum Erstellen von Mock-Objekten für Unit-Tests.[3] Es läuft als Erweiterung anderer Mocking-Frameworks wie Mockito oder Easymock und erweitert deren Funktionsumfang um die Fähigkeit, bestimmte Sprachaspekte wie statische Methoden oder Konstruktoren zu mocken.
PowerMock | |
---|---|
Basisdaten | |
Hauptentwickler | Johan Haleby, Jan Kronquist |
Aktuelle Version | 2.0.9[1] (2. November 2020) |
Betriebssystem | Plattformübergreifend |
Programmiersprache | Java[2] |
Kategorie | Test-Framework |
Lizenz | Apache-Lizenz |
powermock.org |
PowerMock verwendet Techniken wie einen eigenen Klassenlader oder Bytecode-Manipulation um in den Mock-Objekten die mit den üblichen Sprachkonstrukten nicht änderbaren Aspekte wie statische oder finale Methoden bzw. Konstruktoren zu manipulieren.
PowerMock wurde ursprünglich von Johan Haleby und Jan Kronquist entwickelt, inzwischen arbeiten mehr als 10 Entwickler an der Software.[4] 2008 erschien mit Version 1.0 der erste Major-Release. PowerMock unterliegt der Lizenz Apache 2.0. Powermock wird von bekannten Frameworks und Werkzeugen wie Spring, Neo4j, Checkstyle, JBoss AS oder Hudson zum Testen verwendet.[5]
Beispiel
Das folgende Beispiel[6] demonstriert einen Teil der Möglichkeiten, die PowerMock bietet. Gegeben sei folgendes Szenario:
Die zu testende Unit sei die Klasse Calculator
, die die Berechnung zweier Integer-Werte an die Klasse MathUtil
delegiert, die nur statische Methoden anbietet:
public class Calculator {
public int add(int a, int b) {
return MathUtil.addInteger(a, b);
}
}
public abstract class MathUtil {
public static final int addInteger(int a, int b) {
return a + b;
}
private MathUtil() {}
}
Das Verhalten von MathUtil
soll nun gemockt werden, weil im Testszenario die Addition andere Ergebnisse als sonst liefern soll. Der folgende Test ermöglicht dies:
@RunWith(PowerMockRunner.class)
@PrepareForTest( MathUtil.class )
public class CalculatorTest {
/** Unit under test. */
private Calculator calc;
@Before public void setUp() {
calc = new Calculator();
PowerMockito.mockStatic(MathUtil.class);
PowerMockito.when(MathUtil.addInteger(1, 1)).thenReturn(0);
PowerMockito.when(MathUtil.addInteger(2, 2)).thenReturn(1);
}
@Test public void shouldCalculateInAStrangeWay() {
assertEquals(0, calc.add(1, 1) );
assertEquals(1, calc.add(2, 2) );
}
}
Zunächst wird ein spezieller Test-Runner verwendet, der vom PowerMock-Framework zur Verfügung gestellt wird. Mit der Annotation @PrepareForTest( MathUtil.class )
wird die zu mockende Klasse vorbereitet. Diese Annotation kann auch eine ganze Liste von zu mockenden Klassen verarbeiten. In unserem Beispiel besteht die Liste aus einem Element MathUtil.class
.
In der setup-Methode wird PowerMockito.mockStatic(...)
aufgerufen.
Nun wird das Mock-Verhalten der statischen Methode definiert, indem PowerMockito.when(...)
aufgerufen wird. Danach kommen in den eigentlichen Tests die typischen Assertions.
Literatur
- Michael Tamm: JUnit-Profiwissen: Effizientes Arbeiten mit der Standardbibliothek für automatisierte Tests in Java. dpunkt.verlag, 2013, ISBN 978-3-86491-410-2, 6.9 PowerMock (google.de [abgerufen am 20. Januar 2018]).
Weblinks
Einzelnachweise
- Release 2.0.9. 2. November 2020 (abgerufen am 16. November 2020).
- The powermock Open Source Project on Open Hub: Languages Page. In: Open Hub. (abgerufen am 6. September 2018).
- PowerMock Homepage (englisch)
- Powermock Fakten auf OpenHub
- Powermock-JUnit4 Verwender
- Blog: Testen und Mocken statischer Methoden in Java