我有以下代码:
PowerMockito.mockStatic(DateUtils.class); //And this is the line which does the exception - notice it's a static function PowerMockito.when(DateUtils.isEqualByDateTime (any(Date.class),any(Date.class)).thenReturn(false);
课程开始于:
@RunWith(PowerMockRunner.class)
@PrepareForTest({CM9DateUtils.class,DateUtils.class})
我得到 org.Mockito.exceptions.InvalidUseOfMatchersException ......您不能在验证或存根之外使用参数匹配器..... (错误跟踪中出现两次错误 - 但都指向同一行)
在我的代码中的其他地方的使用时间并且它正常工作。此外,在调试我的代码时,我发现任何(Date.class)都返回null。
我尝试了以下解决方案,我看到其他人觉得有用,但对我来说它不起作用:
添加
@After
public void checkMockito() {
Mockito.validateMockitoUsage();
}
或
@RunWith(MockitoJUnitRunner.class)
或
@RunWith(PowerMockRunner.class)
更改为
PowerMockito.when(new Boolean(DateUtils.isEqualByDateTime(any(Date.class), any(Date.class)))).thenReturn(false);
使用anyObject()
(它不会编译)
使用
notNull(Date.class)
或 (Date)notNull()
替换
when(........).thenReturn(false);
与
Boolean falseBool=new Boolean(false);
和
when(.......).thenReturn(falseBool);
答案 0 :(得分:1)
详细说明PowerMockito Getting Started Page,您需要使用 PowerMock运行程序以及@PrepareForTest
注释。
@RunWith(PowerMockRunner.class)
@PrepareForTest(DateUtils.class)
确保您使用的是JUnit 4 org.junit.runner.RunWith
附带的@RunWith注释。因为它始终被value
属性所接受,所以如果您使用正确的RunWith类型,那么您收到该错误是非常奇怪的。
any(Date.class)
返回null
是正确的:Mockito使用a hidden stack of matchers来跟踪哪些匹配器表达式与匹配的参数对应,而不是使用魔术“匹配任何日期”实例,并返回{ {1}}用于对象(0表示整数,false表示布尔值,等等。)
答案 1 :(得分:0)
所以最后,对我有用的是将执行异常的行导出到其他一些静态函数。我称之为 compareDates 。
我的实施:
在被测试的类中(例如 - MyClass )
static boolean compareDates(Date date1, Date date2) {
return DateUtils.isEqualByDateTime (date1, date2);
}
在测试班中:
PowerMockito.mockStatic(MyClass.class);
PowerMockito.when(MyClass.compareDates(any(Date.class), any(Date.class))).thenReturn(false);
不幸的是,我不能说我完全理解为什么这个解决方案有效,而之前的解决方案并没有。 也许这与 DateUtils 类不是我的代码这一事实有关,我无法访问它的源代码,只能生成 .class 文件,但我真的不确定。
编辑
上述解决方案只是一种解决方法,无法解决代码中DateUtils
isEqualByDateTime 调用的需要。
什么实际解决了真正的问题是导入具有实际实现的DateUtils
类,而不是仅扩展它的类,这是我之前导入的。
执行此操作后,我可以使用原始行
PowerMockito.mockStatic(DateUtils.class);
PowerMockito.when(DateUtils.isEqualByDateTime (any(Date.class),any(Date.class)).thenReturn(false);
没有任何例外。