java:如何模拟 Calendar.getInstance()?

2022-09-01 09:28:39

在我的代码中,我有这样的东西:

private void doSomething() {
   Calendar today = Calendar.getInstance();
   ....
}

我如何在我的 junit 测试中“嘲笑”它以返回特定日期?


答案 1

你可以将PowerMock与Mockito结合使用来模拟它:

在你的班级之上:

@RunWith(PowerMockRunner.class)
@PrepareForTest({ClassThatCallsTheCalendar.class})

成功的关键是,你必须把你使用日历的类放在PrepForTest中,而不是日历本身,因为它是一个系统类。

然后是嘲笑本身:

mockStatic(Calendar.class);
when(Calendar.getInstance()).thenReturn(calendar);

答案 2

在我看来,您有三个明智的选择:

  1. 将实例注入您当天设置的任何方法/类中。Calendar

    private void method(final Calendar cal) { Date today = cal.getTime(); }

  2. 使用 JodaTime 而不是 .这与其说是一种选择,不如说是一个建议,因为JodaTime会让你的生活更轻松。您仍然需要将这段时间注入到方法中。Calendar

    DateTime dt = new DateTime();

    Date jdkDate = dt.toDate();

  3. 包装在一些允许您获取时间的界面中。然后,您只需模拟该接口并使其返回常量。CalendarDate

    Date today = calendarInterfaceInstance.getCurrentDate()