Mock Static Method mit JMockit

1. Übersicht

Einige beliebte Spottbibliotheken wie Mockito und Easymock generieren Modelle, indem sie das vererbungsbasierte Klassenmodell von Java nutzen. EasyMock implementiert zur Laufzeit eine Schnittstelle, während Mockito von der Zielklasse erbt, um einen Spottstub zu erstellen.

Keiner der beiden Ansätze eignet sich gut für statische Methoden, da statische Methoden einer Klasse zugeordnet sind und nicht überschrieben werden können. Allerdings tut JMockit spöttischen Merkmale eine statische Methode zur Verfügung stellen.

In diesem Tutorial werden einige dieser Funktionen erläutert.

Eine Einführung in JMockit finden Sie in unserem vorherigen Artikel.

2. Maven-Abhängigkeiten

Beginnen wir mit Maven-Abhängigkeiten:

 org.jmockit jmockit 1.24 test 

Die neuesten Versionen dieser Bibliotheken finden Sie in Maven Central.

3. Statische Methode, die von der nicht statischen Methode aufgerufen wird

Betrachten wir zunächst einen Fall, in dem wir eine Klasse mit einer nicht statischen Methode haben, die intern von der statischen Methode abhängt :

public class AppManager { public boolean managerResponse(String question) { return AppManager.isResponsePositive(question); } public static boolean isResponsePositive(String value) { if (value == null) { return false; } int length = value.length(); int randomNumber = randomNumber(); return length == randomNumber ? true : false; } private static int randomNumber() { return new Random().nextInt(7); } }

Jetzt wollen wir die Methode managerResponse () testen . Da der Rückgabewert von einer anderen Methode abhängt, müssen wir die Methode isResponsePositive () verspotten .

Wir können diese statische Methode mit JMockits anonymer Klasse mockit.MockUp.MockUp ( wobei T der Klassenname sein wird ) und der Annotation @Mock verspotten :

@Test public void givenAppManager_whenStaticMethodCalled_thenValidateExpectedResponse() { new MockUp() { @Mock public boolean isResponsePositive(String value) { return false; } }; assertFalse(appManager.managerResponse("Some string...")); }

Hier verspotten wir das isResponsePositive () mit einem Rückgabewert, den wir für den Test verwenden möchten. Überprüfen Sie daher das erwartete Ergebnis mit dem in Junit-5 verfügbaren Dienstprogramm Assertions .

4. Testen Sie die private statische Methode

In einigen Fällen verwenden andere Methoden private statische Methoden der Klasse:

private static Integer stringToInteger(String num) { return Integer.parseInt(num); }

Um eine solche Methode zu testen, müssten wir uns über eine private statische Methode lustig machen . Wir können die von JMockit bereitgestellte Dienstprogrammmethode Deencapsulation.invoke () verwenden :

@Test public void givenAppManager_whenPrivateStaticMethod_thenValidateExpectedResponse() { int response = Deencapsulation.invoke(AppManager.class, "stringToInteger", "110"); assertEquals(110, response); }

Wie der Name schon sagt Zweck ist, ist es de-kapseln den Zustand eines Objekts. Auf diese Weise vereinfacht JMockit Testmethoden, die sonst nicht getestet werden könnten.

5. Schlussfolgerung

In diesem Artikel haben wir gesehen, wie statische Methoden mit JMockit verspottet werden können . Weitere Informationen zu einigen erweiterten Funktionen von JMockit finden Sie in unserem Artikel zur erweiterten Verwendung von JMockit.

Wie üblich ist der vollständige Quellcode für dieses Tutorial auf GitHub verfügbar.