Junit Mockito—您不能在验证或存根之外使用参数匹配器—已经尝试了许多方法,但仍然没有解决方案
我有以下代码: 课程以:Junit Mockito—您不能在验证或存根之外使用参数匹配器—已经尝试了许多方法,但仍然没有解决方案,junit,mockito,powermockito,Junit,Mockito,Powermockito,我有以下代码: 课程以: @RunWith(PowerMockRunner.class) @PrepareForTest({CM9DateUtils.class,DateUtils.class}) 我得到了org.Mockito.exceptions.invalidUseofMatcherException。。。。。。不能在验证或存根之外使用参数匹配器…(错误在故障跟踪中出现两次,但都指向同一行) 在我的代码的其他地方,when的用法已经完成并且工作正常。此外,在调试代码时,我发现any(Dat
@RunWith(PowerMockRunner.class)
@PrepareForTest({CM9DateUtils.class,DateUtils.class})
我得到了org.Mockito.exceptions.invalidUseofMatcherException。。。。。。不能在验证或存根之外使用参数匹配器…(错误在故障跟踪中出现两次,但都指向同一行)
在我的代码的其他地方,when的用法已经完成并且工作正常。此外,在调试代码时,我发现any(Date.class)返回null
我曾尝试过以下解决方案,我发现其他人认为这些解决方案很有用,但对我来说,它们不起作用:
@之后
公共无效checkMockito(){
Mockito.validateMockitoUsage();
}
或
@RunWith(MockitoJUnitRunner.class)
或
@RunWith(PowerMockRunner.class)
when(新布尔值(DateUtils.isEqualByDateTime(any(Date.class)、any(Date.class)))。然后返回(false)代码>
anyObject()
(它不编译)notNull(Date.class)
或(Date)notNull()
when(…..),然后返回(false)代码>
与
Boolean false bool=新布尔值(false)代码>
和
when(……)。然后返回(falseBool)代码>
@PrepareForTest
注释
确保您使用的是JUnit4附带的@RunWith注释,org.JUnit.runner.RunWith
。因为它总是接受值
属性,所以如果使用正确的RunWith类型,就会收到错误,这对我来说非常奇怪
any(Date.class)
返回null
是正确的:Mockito没有使用神奇的“匹配任何日期”实例,而是使用它来跟踪哪些匹配器表达式对应于匹配的参数,并为对象返回null
(0表示整数,false表示布尔值,等等)。因此最后,对我来说,有效的方法是将执行异常的行导出到其他静态函数。我称之为比较
我的实现:
在被测试的类中(例如-MyClass)静态布尔比较数据(日期1,日期2){
返回日期utils.isEqualByDateTime(日期1,日期2);
}
在测试类:PowerMockito.mockStatic(MyClass.class);
当(MyClass.compareDates(any(Date.class)、any(Date.class)))时,返回(false)代码>
不幸的是,我不能说我完全理解为什么此解决方案有效,而前一个解决方案无效。
可能是因为DateUtils类不是我的代码,我无法访问它的源代码,只能访问生成的.class文件,但我真的不确定
编辑
上述解决方案只是一种变通方法,无法解决在代码中包含DateUtils
isEqualByDateTime调用的需要。
实际解决的真正问题是导入具有实际实现的DateUtils
类,而不是我之前导入的仅扩展它的类
这样做之后,我可以使用原来的线路
PowerMockito.mockStatic(DateUtils.class);
PowerMockito.when(DateUtils.isEqualByDateTime (any(Date.class),any(Date.class)).thenReturn(false);
没有任何异常。好的,看来我忘了导入“RunWith”,但在导入它并克服编译错误后,我仍然得到了相同的异常。此外,我在原始帖子(现已编辑)中没有提到它,但在我的代码中使用了这个@PrepareForTest(DateUtils.class),没有可测试的示例,注意到下面提到的作为评论的澄清,我认为这个问题没有足够的细节来回答未来的读者或对他们有用。请考虑添加更多细节。(请注意,Mockito matcher带有状态,因此您可以通过尝试将matcher值“保存到局部变量”来获得类似的异常,并且Mockito在稍后的存根/验证调用之前不会告诉您这一点。发布周围的代码对于诊断matcher问题至关重要。)
@RunWith(PowerMockRunner.class)
@PrepareForTest(DateUtils.class)
PowerMockito.mockStatic(DateUtils.class);
PowerMockito.when(DateUtils.isEqualByDateTime (any(Date.class),any(Date.class)).thenReturn(false);