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の依存関係
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で入手できます。