HOWTO · Java

Mockito を使用して Java で静的メソッドをモックする

このチュートリアルでは、Java で mockito を使用して静的メソッドをモックする方法を示します。

このページの内容

このチュートリアルでは、mockito を使用して Java で静的メソッドをモックする方法を示します。

Java の静的メソッドのモック

Java で単体テストを実行する場合は、静的メソッドのモックが必要です。 Mockito 3.4.0 バージョンより前では、PowerMock を使用して静的メソッドとプライベート メソッドをモックする必要があります。

Mockito 3.4.0 では、静的メソッドを直接モックできます。 このチュートリアルでは、Java で mockito を使用して静的メソッドをモックする方法を示します。

Maven の依存関係を追加する

mockito を開始する前に、システムに追加する必要があります。 静的メソッドをモックするには、mockito インライン モッキングから インライン モック作成 が必要です。

mockito-inline は、以前はモックできなかった静的メソッドと最終クラスのモック機能を提供するコミュニティ フィードバック用に個別に開発されています。 mockito インライン モッキングの Maven 依存関係は次のとおりです。

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-inline</artifactId>
    <version>4.6.1</version>
    <scope>test</scope>
</dependency>

この依存関係を Maven システムの pom.xml に追加すれば、準備完了です。

Mockito インライン モッキングを使用したさまざまなコード例

まず静的メソッドのモックに適用できるシステムを決めましょう。 引数のあるメソッドと引数のないメソッドの 2つのメソッドを持つ単純なクラスを作成しましょう。 例を参照してください:

package delftstack;

import java.util.stream.IntStream;

class Mock_Static_Method {
  public static String get_Value() {
    return "delftstack";
  }

  public static int addition(int... args) {
    return IntStream.of(args).sum();
  }
}

上記のコードには、次の 2つのメソッドを持つ単純なクラスが含まれています。

  1. 最初のメソッドは値 delftstack を返し、引数を取りません。
  2. 2 番目のメソッドは引数を取り、それらの合計を返します。

モック静的クラス

静的メソッドをモックする前に、静的クラスをモックする必要があります。 Java で mockito を使用して静的クラスをモックする方法のコード例を次に示します。

try (MockedStatic Mock_Static_Class = mockStatic(AppStatic.class)) {
  // Here, we can record mock expectations, test code, and verify mock
}

上記のコードの MockedStatic は、型 static メソッドのスコープ指定されたアクティブなモックを表します。 mockStatic は、静的メソッドの呼び出しを検証するために使用されます。

引数なしの静的メソッドのモック

引数を取らず、値 delftstack を返す最初のメソッド get_Value() をモックしてみましょう。 get_Value() メソッドをモックして、値 delftstack1 を返します。 例を参照してください。

@Test
public void Testing_Get_Value() {
  // Outside the scope
  assertEquals("delftstack", Mock_Static_Method.get_Value());

  try (MockedStatic Mock_Static = mockStatic(Mock_Static_Method.class)) {
    Mock_Static.when(Mock_Static_Method::get_Value).thenReturn("delftstack1");

    // Inside the scope
    assertEquals("delftstack1", Mock_Static_Method.get_Value());
    Mock_Static.verify(Mock_Static_Method::get_Value);
  }

  // Outside the scope
  assertEquals("delftstack", Mock_Static_Method.get_Value());
}

上記のコードは、静的メソッド get_Value(), をモックしており、スコープ外ではメソッドは delftstack を返し、スコープ内では delftstack1 を返します。

引数付きの静的メソッドのモック

引数付きの静的メソッドのモックと引数なしの静的メソッドのモックには大きな違いはありません。

静的メソッドを引数でモックするには、柔軟な引数一致を期待とラムダ式で使用してメソッドを呼び出すことができます。 例を参照してください:

@Test
public void Testing_Addition() {
  assertEquals(3, Mock_Static_Method.addition(1, 2));

  try (MockedStatic Mock_Static = mockStatic(Mock_Static_Method.class)) {
    Mock_Static.when(() -> Mock_Static_Method.addition(anyInt(), anyInt())).thenReturn(10);

    assertEquals(10, Mock_Static_Method.addition(1, 2));
    Mock_Static.verify(() -> ClassWithStaticMethod.addition(1, 2));
  }

  assertEquals(3, Mock_Static_Method.addition(1, 2));
}

上記のコードは、上記のコードの引数を使用して静的メソッドをモックします。

上記のコードは、指定された引数の合計を計算するために使用される IntStream.of(args).sum() をモックしているため、指定された引数の合計を返します。 スコープ外ではメソッドは合計 3 を返し、スコープ内では値 10 を返す必要があります。