Schein statische Methode mit JMockit

Mock Static-Methode mit JMockit

1. Überblick

Einige beliebte Verspottungsbibliotheken wieMockito and Easymockgenerieren Mock-ups, indem sie das auf Vererbung basierende Klassenmodell von Java nutzen. EasyMock implements an interface at runtime, whereas Mockito inherits from the target class to create a mocking stub.

Keiner der beiden Ansätze eignet sich für statische Methoden, da statische Methoden einer Klasse zugeordnet sind und nicht überschrieben werden können. JMockit does provide a static method mocking features.

In diesem Tutorial werden einige dieser Funktionen erläutert.

Eine Einführung in JMockit finden Sie in unserenprevious article.

2. Maven-Abhängigkeiten

Beginnen wir mit Maven-Abhängigkeiten:


    org.jmockit
    jmockit
    1.24
    test

Die neuesten Versionen dieser Bibliotheken finden Sie unterMaven Central.

3. Statische Methode Wird von der nicht statischen Methode aufgerufen

Betrachten wir zunächst einen Fall, in dem wira class with a non-static method that internally depends upon static method haben:

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 MethodemanagerResponse(). testen. Da ihr Rückgabewert von einer anderen Methode abhängt, müssen wir die MethodeisResponsePositive() verspotten.

Wir können diese statische Methode mitJMockit’s anonymer Klassemockit.MockUp.MockUp<T> (where T will be the class name) und@Mock annotation 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 dieisResponsePositive() 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 DienstprogrammAssertions.

4. Private statische Methode testen

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

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

Zum Testen einer solchen Methode werdenwe’d need to mock private static method. Wir können die vonJMockit bereitgestellteDeencapsulation.invoke() -Sutilitätsmethode verwenden:

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

Wie der Name schon sagt, besteht der Zweck darin,de-encapsulateden Status eines Objekts zu bestimmen. Auf diese Weise vereinfacht JMockit Testmethoden, die sonst nicht getestet werden könnten.

5. Fazit

In diesem Artikel haben wir gesehen, wie statische Methoden mitJMockit verspottet werden können. Um einen tieferen Einblick in einige der erweiterten Funktionen von JMockit zu erhalten, werfen Sie einen Blick auf unsere JMockit Advanced Usagearticle.

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