【发布时间】:2018-02-16 17:48:07
【问题描述】:
我正在使用日历对象来确定是否根据当前日期/小时值增加系统的工作负载。鉴于此对象使用静态方法,我使用 PowerMock 来模拟具有以下注释的静态方法:
@RunWith(PowerMockRunner.class)
@PrepareForTest({ Calendar.class })
被测代码非常简单(尽管我知道我的逻辑需要工作):
public void determineDefaultMaximumScans() throws ParseException{
parseTime();
Calendar cal = Calendar.getInstance();
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
System.out.println(cal.get(Calendar.DAY_OF_WEEK));
if(dayOfWeek == (Calendar.SATURDAY) || dayOfWeek == (Calendar.SUNDAY)){
setDefaultMax(calculateNewDefaultMax(getDefaultMax()));
System.out.println("defaultMax increased by 20%");
} else {
if(currentTime.after(afterHoursBegin) && currentTime.before(afterHoursEnd)){
System.out.println("Not afterhours. Maintaining current maximum.");
setDefaultMax(defaultMax);
System.out.println("Current Maximum number of scans: " + getDefaultMax());
}
}
}
我的测试用例如下:
@SuppressWarnings("static-access")
@Test
public void testDetermineMaximumScans() throws ParseException{
PowerMock.mockStatic(Calendar.class);
String beginningTime = "18:00";
String endingTime = "05:00";
mockAfterHoursBegin = parser.parse(beginningTime);
mockAfterHoursEnd = parser.parse(endingTime);
mockCurrentTime = parser.parse(parser.format(new Date()));
EasyMock.expect(Calendar.getInstance()).andReturn(mockCalendar);
EasyMock.expect(mockCalendar.get(Calendar.DAY_OF_WEEK)).andReturn(6);
EasyMock.replay(mocks);
offHourMaximumCalculator.determineDefaultMaximumScans();
EasyMock.verify(mocks);
}
到目前为止,我所有返回特定值的尝试都会导致以下断言错误。现在我隐约明白为什么它会返回默认值,但我不明白为什么我不能强制该值或如何绕过这个期望。总的来说,模拟对我来说仍然是一个令人沮丧的谜。我错过了什么?
java.lang.AssertionError:
Expectation failure on verify:
Calendar.get(7): expected: 1, actual: 0
【问题讨论】:
-
仅供参考:
Calendar是一个糟糕的老类,现在是遗留的,几年前被 java.time 类取代,例如ZonedDateTime。