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

问题描述 投票:0回答:4

我有以下代码:

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

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

junit mockito powermockito
4个回答
2
投票

PowerMockito入门页面上的详细说明,您需要使用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,等等)。


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

无一例外。


0
投票

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

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

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

 @PrepareForTest(TextUtils::class)

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

PowerMockito.mockStatic(TextUtils::class.java)

0
投票

就我而言,我使用的是 Mockito。我必须传递整数。

any()
不起作用,所以出于某种原因我不得不使用
anyInt()
作为静态方法参数。

PS:github上也有相关问题 -> https://github.com/mockito/mockito/issues/2497

© www.soinside.com 2019 - 2024. All rights reserved.