Mockito - 0 个预期匹配器,1 个记录(InvalidUseOfMatchersException)

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

我正在尝试模拟一些 mongo 类,这样我就不需要连接(相当标准的东西),但以下代码给我带来了问题:

when(dbCollection.find(isA(DBObject.class))).thenReturn(dbCursor);

运行这个 get 就是我:

org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
参数匹配器的使用无效!
预计有 0 个匹配者,已记录 1 个:
在...GridFileManagerTest.beforeClass(GridFileManagerTest.java:67)

如果匹配器与原始值组合,可能会出现此异常:
//不正确:someMethod(anyObject(), "raw String");

使用匹配器时,所有参数都必须由匹配器提供。
例如:
//正确:
someMethod(anyObject(), eq("匹配器的字符串"));

有关更多信息,请参阅 Matchers 类的 javadoc。

如果我这样做:

when(dbCollection.find(mock(DBObject.class))).thenReturn(dbCursor);

不再有这个问题。但这似乎并没有实现我想要的 - 我想在使用 DBObject 类型的对象调用该方法时返回值。

想法?

java exception mocking mockito
6个回答
25
投票

我认为你的结果与如果

dbCollection
不是 Mockito 模拟(或者你的方法是静态或最终的)时发生的结果兼容。这意味着在不能使用匹配器的地方使用了匹配器;因此“0 个匹配者预期,1 个记录”。


6
投票

如果您有默认参数,则可以在 Scala 中重现同样的问题。看起来您似乎为每个参数提供了 any() ,但您应该验证方法定义没有任何默认参数,这可能会造成混乱。


4
投票

在我的例子中,模拟的方法是

final
。从方法签名中删除
final
解决了问题。


2
投票

可能不相关,但当我监视包私有方法时,我遇到了同样的错误。将其更改为公开解决了我的问题。


0
投票

当我四处移动测试并在存根时使用实际对象而不是模拟时,这也发生在我身上


0
投票

就我而言,当我在子类上模拟静态方法时,就会发生这种情况(我试图模拟的方法位于父类中)。更改模拟以引用父类固定的东西。

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