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)

  • 如上所述,您需要同时使用PowerMock runner和
    @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);