504 Stimmen

Das Mocken von statischen Methoden mit Mockito

Ich habe eine Fabrik geschrieben, um java.sql.Connection Objekte zu erzeugen:

public class MySQLDatabaseConnectionFactory implements DatabaseConnectionFactory {

    @Override public Connection getConnection() {
        try {
            return DriverManager.getConnection(...);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}

Ich möchte die Parameter überprüfen, die an DriverManager.getConnection übergeben werden, aber ich weiß nicht, wie man eine statische Methode mockt. Ich benutze JUnit 4 und Mockito für meine Testfälle. Gibt es eine gute Möglichkeit, diesen speziellen Anwendungsfall zu mocken/überprüfen?

6voto

Dupinder Singh Punkte 6087

Ich habe eine Lösung in Mockito gefunden. Diese Funktion ist nur ab der Version 3.4.0 verfügbar

https://asolntsev.github.io/en/2020/07/11/mockito-static-methods/

  • Abhängigkeit

    Ersetzen Sie in Ihrem build.gradle mockito-core:3.3.3 durch mockito-inline:3.4.0:

    testImplementation('org.mockito:mockito-inline:3.4.0')
  • Was werden wir mocken

     class Buddy 
     {
         static String name() 
         {
            return "John";
         }
     }
  • Mocke die statische Methode

        @Test
        void lookMomICanMockStaticMethods() 
        {
             assertThat(Buddy.name()).isEqualTo("John");
    
            try (MockedStatic theMock = Mockito.mockStatic(Buddy.class)) 
            {
                theMock.when(Buddy::name).thenReturn("Rafael");
                assertThat(Buddy.name()).isEqualTo("Rafael");
            }
    
            assertThat(Buddy.name()).isEqualTo("John");
        }

Ich denke, das könnte uns helfen.

5voto

marek.kapowicki Punkte 674

Um eine statische Methode zu verspotten, sollten Sie Powermock verwenden. Schauen Sie sich das an unter: https://github.com/powermock/powermock/wiki/MockStatic. Mockito bietet diese Funktionalität nicht.

Sie können einen guten Artikel über Mockito lesen unter: http://refcardz.dzone.com/refcardz/mockito

4voto

RCvaram Punkte 3578

Wenn Sie versuchen, die statische Methode zu verulken, müssen Sie den Test innerhalb des try-Blocks schreiben, weil es wichtig ist zu beachten, dass scoped Mocks vom Entity geschlossen werden müssen, das den Mock aktiviert.

      try (MockedStatic tester = Mockito.mockStatic(Tester.class)) {
            tester.when(() -> Tester.testStatic("Testing..")).thenReturn(mock(ReturnObject.class));
    //Hier müssen Sie die Testfälle schreiben
      }

In dem obigen Beispiel müssen wir die Tester-Klasse testStatic-Methode mit dem Eingabeparameter "Testing..." verulken. Hier wird diese Methode ein Objekt vom Typ der ReturnObject-Klasse zurückgeben. Daher schreiben wir den Mockito when-Chain wie oben.

Vergessen Sie nicht, die folgende Abhängigkeit in Ihrem Gradle/Maven hinzuzufügen

    testImplementation 'org.mockito:mockito-inline:4.3.1'

2voto

Benas Punkte 1767

Da diese Methode statisch ist, hat sie bereits alles, was Sie benötigen, um sie zu verwenden, daher macht es das Mocken überflüssig. Das Mocken der statischen Methoden gilt als schlechte Praxis.

Wenn Sie versuchen, dies zu tun, bedeutet das, dass etwas nicht stimmt mit der Art und Weise, wie Sie das Testen durchführen möchten.

Natürlich können Sie PowerMockito oder ein anderes Framework verwenden, das dazu in der Lage ist, aber überdenken Sie Ihre Herangehensweise.

Zum Beispiel: Versuchen Sie, die Objekte zu mocken/bereitzustellen, die diese statische Methode stattdessen verwendet.

1voto

Sie können statischen Code ohne Hinzufügen von Abhängigkeiten oder Verwendung von PowerMock verspotten. Das geht mit diesem Trick :)

Fügen Sie die Datei org.mockito.plugins.MockMaker unter dem Ordner src/test/resources/mockito-extensions/ mit diesem Inhalt hinzu:

mock-maker-inline

Bildbeschreibung hier eingeben

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X