JUnit

JUnitのPowerMockを利用してstaticメソッドのMock化と呼出確認をしてみた

これまでは、Mockitoを利用してインスタンスメソッドをMock化する方法について記載していたが、今回はstaticメソッドのMock化と呼出確認をしてみたので、そのサンプルプログラムを共有する。

staticメソッドのMock化は、Mockitoでは実行できないので、PowerMockというライブラリを利用する。

前提条件

下記記事の実装が完了していること。

JunitのMockitoを利用してモック化したオブジェクトの引数と呼出回数を取得してみたJUnitのテストを行う際、Mock化したメソッドの戻り値がvoid型で、Mock化したメソッドが呼ばれたかどうかわからない場合がある。...

サンプルプログラムの内容

作成したサンプルプログラムの構成は以下の通り。
サンプルプログラムの構成
なお、上記の赤枠のうち、「build.gradle」が変更したプログラムで、他は今回新規で作成したプログラムとなる。

build.gradleの内容は以下の通り。テストクラスでlombokを利用できる設定・PowerMockが利用できるための設定を追加している。

さらに、「DemoServiceImplTest3.java」の内容は以下の通り。

PowerMockを利用できるために、クラスの先頭に「@RunWith(PowerMockRunner.class)」「@PrepareForTest({(staticメソッドをもつクラス).class})」というアノテーションを追加している。また、initメソッド内で「PowerMockito.mockStatic((staticメソッドをもつクラス).class)」を実行することで、指定したstaticメソッドがMock化している。

さらに、各テストメソッド内で「PowerMockito.when(staticメソッド(引数)).thenReturn(戻り値)」を実行することで、指定したstaticメソッドの戻り値を指定している。

また、「testCheckFormDateCheckUtilArgs」メソッド内で、staticメソッドの呼出確認とそのときの引数を取得している。テスト対象クラス実行後に、「PowerMockito.verifyStatic(staticメソッドをもつクラス.class, Mockito.times(呼出回数))」を実行し、その直後に呼出確認対象となるstaticメソッドを実行することで、staticメソッドの呼出回数確認が行える。さらに、Mockito利用時と同様に、そのメソッド呼出時の引数は、ArgumentCaptorクラスを利用することで取得できる。

その他、「BindingResultModel.java」「BindingResultRejectValueModel.java」の内容は以下の通り。

なお、「BindingResultModel.java」BindingResultオブジェクトの生成のために、「BindingResultRejectValueModel.java」はBindingResultオブジェクトの設定値を確認するために、それぞれ追加している。

今回作成した「DemoServiceImplTest3.java」の実行結果は以下の通り。ワーニングメッセージが出力されるが、テストメソッドが正常に実行できたことが確認できる。
JUnit実行結果

要点まとめ

  • PowerMockというライブラリを利用すると、staticメソッドをMock化することができる。
  • staticメソッドをMock化するには、クラスの先頭に「@RunWith(PowerMockRunner.class)」「@PrepareForTest({(staticメソッドをもつクラス).class})」というアノテーションを付与し、「PowerMockito.mockStatic((staticメソッドをもつクラス).class)」を実行すればよい。
  • 「PowerMockito.when(staticメソッド(引数)).thenReturn(戻り値)」を実行することで、指定したstaticメソッドの戻り値を指定することができる。
  • テスト対象クラス実行後に、「PowerMockito.verifyStatic(staticメソッドをもつクラス.class, Mockito.times(呼出回数))」を実行し、その直後に呼出確認対象となるstaticメソッドを実行することで、staticメソッドの呼出回数確認が行える。また、そのメソッド呼出時の引数は、ArgumentCaptorクラスを利用することで取得できる。