公式サイト(http://jmockit.org/)から下記のjarをダウンロードする。
取得したjarファイルをJUnitのjarよりも先にクラスパスへ通す。
Eclipseの場合
まずはテスト対象クラスを2本ほど作成する。
1つは現在日付をyyyy/MM/dd形式で取得するクラス(MyCalendar.java)。
package test;
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class MyCalendar {
/** 現在日をyyyy/MM/dd形式で取得 */
public String getToday() {
Calendar cal = Calendar.getInstance();
return new SimpleDateFormat("yyyy/MM/dd").format((cal.getTime()));
}
}
もう1つは上記で作成したクラスを使用して、今日が12月かどうかを判定するクラス(Sample.java)。
package test;
public class Sample {
/** 現在日が12月か判定 */
public boolean isDecember() {
MyCalendar myCal = new MyCalendar();
String month = myCal.getToday().split("/")[1];
if("12".equals(month)){
return true;
}
return false;
}
}
次にSampleクラスのisDecember()をテストするクラスを作成する。(SampleTest.java)
モックを使わないでテストすると、テスト実施日によってMyCalendarのgetToday()の値が変わってしまうため、テストが成功したり失敗したりする(継続的なテストもできない)。 しかし、モックを使うことによって常に同じ状態でテストを行うことができる。
package test;
import static org.junit.Assert.*;
import org.junit.Test;
import mockit.Expectations;
import mockit.Mocked;
public class SampleTest {
// ①モックにする変数にアノテーション付加
@Mocked
private MyCalendar myCal;
@Test
public void testIsDecember() {
// ②モックにしたクラスの挙動を記述
new Expectations() {{
myCal.getToday();
result = "2015/12/01"; // 1回目に呼ばれたときに返す値
result = "2015/08/15"; // 2回目に呼ばれたときに返す値
}};
Sample sample = new Sample();
assertTrue(sample.isDecember()); // ③現在日が"2015/12/01"になるためtrue
assertFalse(sample.isDecember()); // ④現在日が"2015/08/15"になるためfalse
}
}
[説明]
①モックにする変数にアノテーション付加
モックオブジェクトにする変数に@Mockedアノテーションをつける。@Mocked
private MyCalendar myCal;
②モックにしたクラスの挙動を記述
new Expectations()に挙動を変更したいメソッドと戻り値(result)を記述する。戻り値を列挙すると、メソッドが呼ばれる度に返却される値が変わる。
new Expectations() {{
myCal.getToday();
result = "2015/12/01";
result = "2015/08/15";
}};
③1回目に呼ばれたときはgetToday()が"2015/12/01"を戻すため、結果がtrueになる。
assertTrue(sample.isDecember());
④2回目に呼ばれたときはgetToday()が"2015/08/15"を戻すため、結果がfalseになる。
assertFalse(sample.isDecember());