0

我有以下代码:

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 ......你不能在验证或存根之外使用参数匹配器......(错误在失败跟踪中出现两次 - 但都指向同一行)

在我的代码中的其他地方,何时使用完成并且它工作正常。此外,在调试我的代码时,我发现 any(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);

4

3 回答 3

2

正如PowerMockito Getting Started Page中详细介绍的那样,您需要同时使用PowerMock 运行器和@PrepareForTest注释

@RunWith(PowerMockRunner.class)
@PrepareForTest(DateUtils.class)

确保您使用的是 JUnit 4 附带的 @RunWith 注解,org.junit.runner.RunWith. 因为它总是接受一个value属性,所以如果您使用正确的 RunWith 类型,您会收到该错误,这对我来说很奇怪。

any(Date.class)返回是正确的null:Mockito 没有使用魔术“匹配任何日期”实例,而是使用隐藏的匹配器堆栈来跟踪哪些匹配器表达式对应于匹配的参数,并返回null对象(整数为 0,布尔值为 false,以及等等)。

于 2015-06-29T22:17:16.727 回答
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);

无一例外。

于 2015-07-02T11:42:32.673 回答
0

我在 Kotlin 测试类中遇到了与TextUtils类似的问题

PowerMockito.`when`(TextUtils.isEmpty(Mockito.anyString())).thenReturn(true)

通过在我的测试类顶部添加以下代码来解决它

 @PrepareForTest(TextUtils::class)

并在PowerMockito之前调用了 mockStatic。`when`

PowerMockito.mockStatic(TextUtils::class.java)
于 2021-09-07T14:22:21.417 回答