JMockitを使った擬似静的メソッド

JMockitを使用した静的静的メソッド

1. 概要

Mockito and Easymockなどの一般的なモックライブラリは、Javaの継承ベースのクラスモデルを利用してモックアップを生成します。 EasyMock implements an interface at runtime, whereas Mockito inherits from the target class to create a mocking stub.

静的メソッドはクラスに関連付けられており、オーバーライドできないため、どちらのアプローチも静的メソッドではうまく機能しません。 ただし、JMockit does provide a static method mocking features.

このチュートリアルでは、これらの機能のいくつかについて説明します。

JMockitの概要については、previous articleを参照してください。

2. Mavenの依存関係

Mavenの依存関係から始めましょう:


    org.jmockit
    jmockit
    1.24
    test

これらのライブラリの最新バージョンは、Maven Centralにあります。

3. 非静的メソッドから呼び出された静的メソッド

まず、a class with a non-static method that internally depends upon static methodがある場合を考えてみましょう。

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);
    }
}

ここで、メソッドmanagerResponse().をテストします。その戻り値は別のメソッドに依存するため、isResponsePositive()メソッドをモックする必要があります。

JMockit’s匿名クラスmockit.MockUp.MockUp<T>where T will be the class name)と@Mock annotationを使用して、この静的メソッドをモックできます。

@Test
public void givenAppManager_whenStaticMethodCalled_thenValidateExpectedResponse() {
    new MockUp() {
        @Mock
        public boolean isResponsePositive(String value) {
            return false;
        }
    };

    assertFalse(appManager.managerResponse("Some string..."));
}

ここでは、テストに使用したい戻り値でisResponsePositive()をモックしています。 したがって、Junit-5で使用可能なAssertionsユーティリティを使用して期待される結果を検証します。

4. プライベート静的メソッドをテストする

いくつかの場合、他のメソッドはクラスのprivate staticメソッドを使用します。

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

このようなメソッドをテストするには、we’d need to mock private static methodを使用します。 JMockitによって提供されるDeencapsulation.invoke() utilityメソッドを使用できます。

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

名前が示すように、その目的はオブジェクトの状態をde-encapsulateすることです。 このようにして、JMockitは他の方法ではテストできなかったテスト方法を簡素化します。

5. 結論

この記事では、JMockitを使用して静的メソッドをモックする方法を見てきました。 JMockitの高度な機能の詳細については、JMockitの高度な使用率articleをご覧ください。

いつものように、このチュートリアルの完全なソースコードはover on GitHubで入手できます。