JavaのJunitでmockitoを使ってStaticメソッドをMock化する方法です。
※JMockitではなくmockitoになります。
Java

サンプルとしてSystem.currentTimeMillis()をメソッド化します。
mockitoと言ってもmockito単体ではStaticメソッドはMock化できません。

そこで登場するのかPowerMockです。
PowerMockを使えばStaticメソッドをMock化できます。

スポンサーリンク


バージョン

  • Java8
  • Spring boot 
  • mokito1.7 
  • PowerMock1.7.3 

サンプルコード

build.gradle

PowerMockが使えるようbuild.gradleに以下を追加します。
testCompile 'org.powermock:powermock-module-junit4:1.7.3'
testCompile 'org.powermock:powermock-api-mockito:1.7.3'
バージョンはご自身の環境に合わせてください。

2019年2月時点ではPowerMockは2.0.0が最新になっています。
2.0.0を使用する場合は以下のように指定します。
powermock-api-mockitoは2.0系から「powermock-api-mockito2」になっています。(2が付く)
testCompile 'org.powermock:powermock-module-junit4:2.0.0'
testCompile 'org.powermock:powermock-api-mockito2:2.0.0'

Junit

staticメソッドを使用するクラスです。
public class Hoge {
  
  public static long getHoge() {
    // staticメソッドを使用する
    return System.currentTimeMillis();
  }
}
テストコードです。
@RunWith(PowerMockRunner.class) 
@PrepareForTest({ Hoge.class, System.class}) 
public class MyTestCase extends TestCase {

  @Test
  public void staticメソッドをMock化するサンプル() {
    val currentTimeMillis = 1546268400000L;

    // mockStaticでstaticクラスをMock化
    PowerMockito.mockStatic(System.class);

    // PowerMockitoのwhenで返したい任意の値を設定
    // 1Lとか適当な値じゃ正しくMock化されない可能性があるので注意
    PowerMockito.when(System.currentTimeMillis()).thenReturn(currentTimeMillis);

    assertEquals(currentTimeMillis, Hoge.getHoge());
  }

}
コメントにも書いていますが、
@PrepareForTestには実際staticメソッドを使用するクラスも指定してください。
指定しないとMock化されません。
これでSystem.currentTimeMillis()からは現在日時ではなく指定した値が取得できるようになります。


まとめ

注意点ですが、mockitoのバージョンが古すぎるとPowerMock2.0系は使用できません。
実行時にエラーになります。

powermock-api-mockito2は1.7系も使用できますがこちらもmokitoが古すぎると使用できません。
エラーになる場合はpowermock-api-mockitoの1.7系を使用しましょう。

java.lang.NoSuchMethodeError: org.mockito.Mockito.framework()Lorg/mockito/MockitoFramework
こんなエラーや
java.lang.ExceptionininitializerError
こんなエラーが出てたらバージョンを確認してみた方がよいかもしれません。


以上、StaticメソッドをMock化する方法でした。




スポンサーリンク