Edited at

JUnit備忘録

More than 1 year has passed since last update.

JUnitの備忘録を記載していく。


Assert

import static org.hamcrest.Matchers.is;

import static org.hamcrest.Matchers.not;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.fail;

// actual = expectの場合、正常
assertThat(actual, is(expect));
// actual != expectの場合、正常
assertThat(actual, is(not(expect)));
// エラー
fail("error reason");


Mockito


mockオブジェクトの作成

import static org.mockito.Mockito.mock;

import static org.mockito.Mockito.spy;

// オブジェクト全体をモック化する場合
Target targetMock = mock(Target.class);
// モック設定したメソッドのみをモック化する場合
Target targetMock = spy(Target.class);


voidメソッドのmock化

import static org.mockito.Matchers.any;

import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doThrow;

// 正常終了させる
doNothing().when(targetMock).targetMethod(anyString(), any(Parameter.class));

// 例外をスローする ※対象メソッドがThrowsする例外またはRuntimeExceptionが指定可能
doThrow(new RuntimeException()).when(targetMock).targetMethod("01");

上記の場合、targetMethodメソッドが引数"01"で呼び出された時に例外をスローする。

任意の引数が渡された場合にモックを動作させる場合は、Stringの場合はanyString()、オブジェクトの場合はany(クラス名)などを指定する。


戻り値のあるメソッドのmock化

import static org.mockito.Matchers.anyString;

import static org.mockito.Mockito.when;

// 戻り値に"ok"を返却する
when(targetMock.targetMethod(anyString())).thenReturn("ok");

// 1回目と3回目の実行に"ok"、2回目の実行に"ng"を返却する
when(targetMock.targetMethod(anyString())).thenReturn("ok", "ng", "ok");

// 例外をスローする ※対象メソッドがThrowsする例外またはRuntimeExceptionが指定可能
when(targetMock.targetMethod(anyString())).thenThrow(new RuntimeException());


mockメソッドのassert

import static org.mockito.Mockito.times;

import static org.mockito.Mockito.verify;

// メソッド実行回数の確認
// targetMethodメソッドが1回だけ実行されたことを確認する
verify(targetMock, times(1)).targetMethod(anyString(), anyString());


Mockitoの注意点


  • publicメソッドのみmock化が可能


  • staticメソッドはmock化できない


  • @InjectMocksによるモックのインジェクションは@InjectMocksで指定したクラスの直のプロパティに対して摘要される。

    つまり、@Injectオブジェクトの中の@Injectに対してはモックをインジェクションしてくれない。

    実現したい場合は、リフレクションを使ってモックを直接、変数に突っ込む必要がある。