6.1 Verspotten der statischen Methode mockStatic()
Und ein weiterer wichtiger Punkt ist das Verspotten und Verifizieren statischer Methoden. „Was ist daran falsch?“, fragen Sie. Ja, statisch, aber die Methoden sind die gleichen. Und du wirst falsch liegen.
Erinnern Sie sich, wo wir angefangen haben, etwas über Scheinobjekte zu lernen? Da diese Objekte künstlich durch die erzeugt werden DynamicProxy
. Und statische Methoden sind nicht an Objekte gebunden und DynamicProxy
es ist unmöglich , Aufrufe an sie über abzufangen . Das ist alles.
Aber auch hier konnten die Macher von Mockito ausweichen – sie schrieben einen eigenen Klassenlader und konnten mit dessen Hilfe Klassen im Handumdrehen ersetzen. Eine große und schwierige Aufgabe, aber sie haben es trotzdem geschafft.
Sie müssen eine zusätzliche Bibliothek hinzufügen zu pom.xml
:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-inline</artifactId>
<version>4.2.0</version>
<scope>test</scope>
</dependency>
So gehen Sie vor, wenn Sie eine statische Methode verspotten müssen.
1 Erstellen Sie ein spezielles Scheinklassenobjekt:
MockedStatic<ClassName>managerObject = Mockito.mockStatic(ClassName.class);
2 Fügen Sie diesem Objekt Operationsregeln hinzu:
An diesem Ziel der Regel muss man auf andere Weise festhalten.
managerObject.when(ClassName::method name).thenReturn(result);
3 Stellen Sie sicher , dass Sie die Verwendung dieses Objekts einschließen,try-with-resources
damit das Objekt sofort gelöscht wird und Mockito die damit verbundenen Regeln löschen kann.
Beispiel:
@Test
void givenStaticMethodWithNoArgs () {
try (MockedStatic< StaticUtils> utilities = Mockito.mockStatic( StaticUtils.class)) {
// add rule
utilities.when(StaticUtils::name).thenReturn("Hello");
// check if the rule works
assertEquals("Hello", StaticUtils.name());
}
}
Nicht so schön wie mit Anmerkungen @Mock
und @Spy
, aber sehr praktisch. Es war sehr schwierig, Tests zu schreiben, wenn es unmöglich war, eine einfache statische Methode zu simulieren, die in den zu testenden Methoden verwendet wurde.