Mockito - 期望0匹配,1记录(InvalidUseOfMatchersException)

Pau*_*aul 10 java exception mocking mockito

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

when(dbCollection.find(isA(DBObject.class))).thenReturn(dbCursor);
Run Code Online (Sandbox Code Playgroud)

运行这个让我:

org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
参数匹配器的使用无效!
0匹配器预期,1记录:
at ... GridFileManagerTest.beforeClass(GridFileManagerTest.java:67)

如果匹配器与原始值组合,则可能发生此异常:
// wrong:someMethod(anyObject(),"raw String");

使用匹配器时,所有参数都必须由匹配器提供.
例如:
// correct:
someMethod(anyObject(),eq("by matcher"));

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

如果我这样做的话:

when(dbCollection.find(mock(DBObject.class))).thenReturn(dbCursor);
Run Code Online (Sandbox Code Playgroud)

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

思考?

Kev*_*ker 18

我认为你的结果与如果dbCollection不是Mockito-mock(或你的方法是静态的或最终的)会发生的结果兼容.这意味着在没有可以使用的情况下使用匹配器; 因此,"0匹配预期,1记录".

  • 但是(假设这是MongDB)它看起来像[`DBCollection#find()`](http://api.mongodb.org/java/2.6/com/mongodb/DBCollection.html#find(com.mongodb.DBObject) )是最终的,具有相同的效果.如果不使用[PowerMock](http://code.google.com/p/powermock/),则无法模拟最终方法. (3认同)

mic*_*del 6

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