JMockitでメソッドをモックするときは、Expectations内でモック対象のメソッドと同じ引数で呼び出す必要がある。
例えば以下のようなメソッドの場合
public String getToday(boolean flg, String str, Map map) {
テストクラスのExpectationsでは以下のように何かしらの引数を指定しなければならない。型だけを合わせたいだけなのに、具体的な値を指定しなければならないのはやや面倒である。
new Expectations() {{
myCal.getToday(true, "12345", new HashMap<String, Object>());
result = "2015/12/01";
}};
Expectationsにはテストコード作成支援として以下の変数を用意している。これらの変数を使えば、設定値をわざわざ考える必要はない。
変数 | 説明 |
---|---|
anyBoolean | boolean変数 |
anyByte | byte変数 |
anyChar | char変数 |
anyDouble | double変数 |
anyFloat | float変数 |
anyLong | long変数 |
anyShort | short変数 |
anyString | String変数 |
any | Object変数。キャストすれば、Object型以外にも使用できる。 |
前述のコードを書き換えると以下となる。
new Expectations() {{
myCal.getToday(anyBoolean, anyString, (HashMap)any);
result = "2015/12/01";
}};
以下サンプルコード。
package mocktest3;
import static org.junit.Assert.*;
import java.util.HashMap;
import org.junit.Test;
import mockit.Expectations;
import mockit.Mocked;
public class MockitTest {
@Mocked
private MyCalendar myCal;
@Test
public void testIsDecember() {
new Expectations() {{
// 引数を指定してgetToday呼び出し
myCal.getToday(anyBoolean, anyString, (HashMap)any);
result = "2015/12/01";
}};
Sample sample = new Sample();
assertTrue(sample.isDecember());
}
}
Sample.java
package mocktest3;
import java.util.HashMap;
public class Sample {
/** 現在日が12月か判定 */
public boolean isDecember() {
MyCalendar myCal = new MyCalendar();
String month = myCal.getToday(true, "", new HashMap<String, Object>()).split("/")[1];
if("12".equals(month)){
return true;
}
return false;
}
}
MyCalendar.java
package mocktest3;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Map;
public class MyCalendar {
public String getToday(boolean flg, String str, Map<String, Object> map) {
Calendar cal = Calendar.getInstance();
return new SimpleDateFormat("yyyy/MM/dd").format((cal.getTime()));
}
}
※サンプルなのでMyCalendar#getTodayの引数は使用していない