2017年7月21日金曜日

Java Calendarクラスのモック化(mock)

Javaの単体テストでCalendarクラスをモック化。
調べても目的のものが見つからなかったのでメモ。

Calendarのインスタンス生成時に指定時刻に設定したい。
JMockitとか使って無理やりやっちゃってます。
モック自体が無理やりな感じだしこれでいっかなぁ。

------------------------------------------------------------------------------------
// Calendarクラスのインスタンスを生成するメソッドを取得(getInstanceの中身)
Method method = Calendar.class.getDeclaredMethod("createCalendar", TimeZone.class, Locale.class);
method.setAccessible(true);

// Calendar.getInstance()を実行した際に指定した時刻を返すようにモック化
Calendar expected = (Calendar) method.invoke(Calendar.class, TimeZone.getDefault(), Locale.getDefault(Locale.Category.FORMAT));
expected.setTime(new Date(1498835040000L)); // Unixミリ秒で時刻を設定
new MockUp<Calendar>() {
@Mock
public Calendar getInstance() {
return expected;
}
};
------------------------------------------------------------------------------------

// テスト対象の例(現在時刻に対して時刻調整をする)
------------------------------------------------------------------------------------
Calendar cal = Calendar.getInstance();
log.info("初期値:" + cal.toString());

// 時刻を調整
cal.add(Calendar.MINUTE, Integer.parseInt(adjustedTime));

log.info("変更値:" + cal.toString());

------------------------------------------------------------------------------------