java - 如何使用 JMockit 模拟 Calendar.getInstance 方法?

标签 java junit mocking jmockit

我正在尝试使用 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/

相关文章:

language-agnostic - 模拟业务对象的案例

java - 数组中的数组?

java - Java 新手 - 对于初学者程序员来说什么是很好的资源

java - 无法在 JBOSS 8.2 上部署 CXF 服务

java - 在 Java 中操作 BigIntegers

java - 模拟 void 方法返回空指针异常

java - 使用 JUnit 以编程方式将 JRE 添加到类路径

spring - @Rollback(false) 无法在使用 SpringJUnit4ClassRunner 的@Before 上工作

java - 如何防止创建模拟对象来运行静态初始化?

python - 在模拟类时如何区分静态方法和实例方法?