我正在尝试使用 JMockit 模拟 Calendar.getInstance()
方法。这是我第一次 mock 任何东西。
下面是我的方法,它以 YYYYMMDD
的格式为我提供最近的 Monday
或最近的 Thursday
的日期。
今天是星期天,所以它应该以 YYYYMMDD
的格式返回星期四的日期,所以它将是 - 2014027
public static String getCorrectDate() {
Calendar cal = Calendar.getInstance();
try {
int dow = cal.get(Calendar.DAY_OF_WEEK);
switch (dow) {
case Calendar.THURSDAY:
case Calendar.FRIDAY:
case Calendar.SATURDAY:
case Calendar.SUNDAY:
while (cal.get(Calendar.DAY_OF_WEEK) != Calendar.THURSDAY) {
cal.add(Calendar.DATE, -1);
}
break;
case Calendar.MONDAY:
case Calendar.TUESDAY:
case Calendar.WEDNESDAY:
while (cal.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) {
cal.add(Calendar.DATE, -1);
}
break;
}
} catch (Exception ex) {
// log error
}
return toDateFormat.format(cal.getTime());
}
所以我的问题是如何使用 JMokcit 模拟 Calendar.getInstance
方法,以便我可以轻松地使用 junit getCorrectDate
方法?
我以前从未 mock 过它,所以我遇到了一些问题?
如果可能的话,任何人都可以提供一个简单的例子吗?
我正在尝试这样做,但它在 MockClass
上提示我,因为它无法解析。我也添加了 JMockit 的 maven 依赖项
@MockClass(realClass = Calendar.class)
class CalendarMock {
private int hour;
private int day;
private int minute;
public CalendarMock(int day, int hour, int minute) {
this.hour = hour;
this.day = day;
this.minute = minute;
}
@Mock
public int get(int id) {
if (id == Calendar.HOUR_OF_DAY) {
return hour;
}
if (id == Calendar.DAY_OF_WEEK) {
return day;
}
if (id == Calendar.MINUTE) {
return minute;
}
return -1;
}
}
最佳答案
public class CalendarTest {
@Test
public void testCalender() {
new MockCalendar(1,2,3);
Calendar c = Calendar.getInstance();
int day = c.get(Calendar.HOUR_OF_DAY);
Assert.assertEquals(day, 2);
}
public static class MockCalendar extends MockUp<Calendar> {
private int hour;
private int minute;
private int day;
public MockCalendar(int day, int hour, int minute) {
this.hour = hour;
this.minute = minute;
this.day = day;
}
@Mock
protected void $init() {}
@Mock
public static Calendar getInstance() {
return new GregorianCalendar(1970,1,1);
}
@Mock
public int get(int id) {
if (id == Calendar.HOUR_OF_DAY) {
return hour;
}
if (id == Calendar.DAY_OF_WEEK) {
return day;
}
if (id == Calendar.MINUTE) {
return minute;
}
return -1;
}
}
}
}
您可以增强获取逻辑来执行操作。
关于java - 如何使用 JMockit 模拟 Calendar.getInstance 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22130521/