Java Mockito-应为0个匹配器,记录了1个(InvalidUseofMatcherException)

Java Mockito-应为0个匹配器,记录了1个(InvalidUseofMatcherException),java,exception,mocking,mockito,Java,Exception,Mocking,Mockito,我试图模拟一些mongo类,这样我就不需要连接(相当标准的东西),但下面的代码给了我一些问题: when(dbCollection.find(isA(DBObject.class))).thenReturn(dbCursor); 运行此get's me: org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 参数匹配器的使用无效 需要0个匹配器,记录了1个: 在…GridFileManagerTest.beforeClas

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

when(dbCollection.find(isA(DBObject.class))).thenReturn(dbCursor);
运行此get's me:

org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
参数匹配器的使用无效
需要0个匹配器,记录了1个:
在…GridFileManagerTest.beforeClass(GridFileManagerTest.java:67)

如果匹配器与原始值组合,则可能发生此异常:
//不正确:someMethod(anyObject(),“原始字符串”)

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

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

如果我要这么做:

when(dbCollection.find(mock(DBObject.class))).thenReturn(dbCursor);
它不再有那个问题了。但这似乎并没有达到我想要的效果——我想在使用DBObject类型的对象调用该方法时返回值


想法?

我认为您的结果与如果
dbCollection
不是Mockito mock(或者您的方法是静态的或最终的)会发生的结果是一致的。这意味着匹配器被用于无法使用的地方;因此“预期0个匹配器,记录1个匹配器”。

可能不相关,但我在发现包私有方法时遇到了相同的错误。将其更改为public为我解决了这个问题。

如果您有默认参数,同样的问题可以在Scala中重现。看起来您为每个参数都提供了any(),但是您应该验证方法定义没有任何可能会把事情搞砸的默认参数。

请参见第一个答案的
[EDIT]
部分。也许你也有同样的问题?那么DBCollection是一个Mockito mock对象吗?它是一个mock(DBCollection.class),但是(假设这是MongDB),它看起来是final,具有相同的效果。你不能不使用就模仿最终方法。这确实是一个最终方法,谢谢你为我澄清这一点!如果可以的话我会的-我没有所需的15个声誉。是的,包私有可见方法也有问题。