自動テストツール JUnit Mockito/PowerMockito

Mockitoとは

Publicメソッドのテスト、Publicメソッド内のメソッドのMock化が可能

PowerMockitoとは

Privateメソッド、Staticメソッドのテストが可能なMockitoの拡張版
Powermockitoを使用する場合もMockitoは使用する。
Mock化、Spy化の手順がMockitoと異なる。
ここではPowerMockitoを使用する前提での手順を記載する

Mock

Mockとは

本番環境で外部のサーバに接続する様な処理に対して、
TEST環境では外部サーバに接続できず必ず失敗してしまうが、
その処理が成功したとしてテストを行いたい場合に使用。
外部接続処理をMockと呼ぶ

Mock化

@Mock
praivete TestClass mock;

Spyとは

テスト対象メソッド自体は実行、メソッド内の一部をMock化する場合のMock

Spy化

@Mock
praivete TestClass mock;

@Before
public void beforeTest() {
 this.mock = PowerMockito.spy(new TestClass());
}

Publicメソッド

Mockito.doReturn(戻り値).when(mock).メソッド名(メソッド引数);

Publicメソッド(Void型)

Mockito.doNothing().when(mock).メソッド名(メソッド引数);
Mockito.doNothing().when(mock).メソッド名(Mockito.any(クラス名.class));

インスタンスをMockで取得

テスト対象のメソッド内等でインスタンス化が実行され、インスタンスメソッドを呼ぶ処理をテストする場合
PowerMockito.whenNew(クラス名.class).withNoArguments().thenReturn(mock);
PowerMockito.whenNew(クラス名.class).withArguments(anyString()).thenReturn(mock);
PowerMockito.whenNew(クラス名.class).withArguments(anyInt()).thenReturn(mock);

Privateメソッド

PowerMockito.doNothing().when(mock,"メソッド名", メソッド引数);
PowerMockito.doReturn(戻り値).when(mock,"メソッド名", メソッド引数);

Mockの挙動も指定

PowerMockito.doAnswer(invocation -> {
 メソッド内部の挙動
 return Void.TYPE;
}).when(mock, "メソッド名", メソッド引数);

テスト実行

mockはスパイ

Publicメソッドの実行

戻り値 = mock.メソッド名(メソッド引数);

Privateメソッドの実行1

Method method = TestClass.class.getDeclaredMethod("プライベートメソッド名", メソッド引数);
method.setAccessible(true);
戻り値 = method.invoke(mock, メソッド引数);

Privateメソッドの実行2

テスト対象メソッドの中のプライベートメソッドを更にMock化する場合
Whitebox.invokeMethod(mock, "プライベートメソッド名", メソッド引数);
戻り値 = method.invoke(service, メソッド引数);

テスト結果の検証

publicメソッドの実行回数

Mockito.verify(mock, times(0)).メソッド名(メソッド引数);
Mockito.verify(mock, times(1)).メソッド名(メソッド引数);

Privateメソッドの実行回数

PowerMockito.verifyPrivate(mock, times(0)).invoke("メソッド名", メソッド引数);
PowerMockito.verifyPrivate(mock, times(1)).invoke("メソッド名", メソッド引数);

1週間でできる会員サイト「Limited」

1週間でできる会員サイト「Limited」
必要最小限。だから分かりやすい。始めやすい。続けやすい。
限定① 安⼼・安全の会員制
限定② 必要最⼩限の機能
限定③ 独⾃機能を追加可能

前の記事

GCP 主なサービス

次の記事

Java8 Optional