CodeGym /Kurse /All lectures for DE purposes /Beliebte Szenarien für die Arbeit mit Mockito

Beliebte Szenarien für die Arbeit mit Mockito

All lectures for DE purposes
Level 1 , Lektion 408
Verfügbar

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 DynamicProxyes 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 @Mockund @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.

Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION