[Mockito] Static メソッドのモック化
mockito バージョン 3.4.0 から Static
メソッドのモック化が可能になった。これまでは、 Static
はモックできず、 PowerMock や EasyMock を別途導入する必要があった。Static
メソッドのテストの書き方をメモ。
依存追加
mockito-inline を追加する。
※ mockito-core
のバージョンは 3.4.0
以上であること。
※ ここでは、Spring Boot Test を使っているので、 mockito-inline
のみ依存に追加。
build.gradle
dependencies {
・・・
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation group: 'org.mockito', name: 'mockito-inline', version: '3.12.4'
}
使い方
Static メソッドのサンプル
public class StaticSample {
// 引数なしサンプル
public static String getName() {
return "Hanano";
}
// 引数ありサンプル
public static String getType(int type) {
if (type == 0) {
return "typeA";
} else {
return "typeB";
}
}
}
Static メソッドのテスト
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
import org.mockito.MockedStatic;
import org.mockito.Mockito;
public class StaticSampleTest {
/**
* 引数なしテスト<br>
* try を抜けたときに、自動で close される。
*/
@Test
public void getNameTest_try_with_resource() {
try (MockedStatic<StaticSample> mock = Mockito.mockStatic(StaticSample.class)) {
mock.when(StaticSample::getName).thenReturn("Taro");
assertEquals("Taro", StaticSample.getName());
}
// Static のモックは try の中だけ有効なため、↓は失敗する
// assertThat(StaticSample.getName()).isEqualTo("Taro");
}
/**
* 引数なしテスト<br>
* ↑のtry-with-resourcesの書き方は、以下のようにも書くことができる。<br>
* mockStatic() を呼んだら、必ず close() を呼ぶ。close しないとエラー発生。
*/
@Test
public void getNameTest_withClose() {
MockedStatic<StaticSample> mock = Mockito.mockStatic(StaticSample.class);
mock.when(StaticSample::getName).thenReturn("Taro");
assertEquals("Taro", StaticSample.getName());
mock.close();
}
/**
* 引数ありテスト
*/
@Test
public void getTypeTest() {
try (MockedStatic<StaticSample> mock = Mockito.mockStatic(StaticSample.class)) {
mock.when(() -> StaticSample.getType(2)).thenReturn("unknown types");
assertEquals("unknown types", StaticSample.getType(2));
}
}
}
・テストは、 try-with-resources
の書き方と、自分で close する書き方がある。調べた感じだと、 try-with-resources の
書き方の方がみたい。
・引数なしテストを引数ありテストのように、ラムダ式で書くこともできる。