Mockito - 您不能在验证或存根之外使用参数匹配器 - 尝试了很多东西但仍然没有解决方案

时间:2015-06-29 15:21:21

标签: junit mockito powermockito

我有以下代码:

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。

我尝试了以下解决方案,我看到其他人觉得有用,但对我来说它不起作用:

  1. 添加 @After public void checkMockito() { Mockito.validateMockitoUsage(); }

    @RunWith(MockitoJUnitRunner.class)

    @RunWith(PowerMockRunner.class)

  2. 更改为 PowerMockito.when(new Boolean(DateUtils.isEqualByDateTime(any(Date.class), any(Date.class)))).thenReturn(false);

  3. 使用anyObject()(它不会编译)

  4. 使用 notNull(Date.class) (Date)notNull()

  5. 替换 when(........).thenReturn(false);


    Boolean falseBool=new Boolean(false);

    when(.......).thenReturn(falseBool);

2 个答案:

答案 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);

没有任何例外。