2012-07-12 3 views
6

Ich versuche, einige Mongo Klassen zu verspotten, so dass ich (ziemlich Standard-Sachen) keine Verbindung benötigen, aber den folgenden Code gibt mir Probleme:Mockito - 0 Matchers Erwartete, 1 Aufgenommen (InvalidUseOfMatchersException)

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

Ausführen dieses mir bekommen ist:

org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
Unerlaubte Verwendung von Argument Matcher!
0 Matcher erwartet, 1 aufgezeichnet:
bei ... GridFileManagerTest.beforeClass (GridFileManagerTest.java:67)

Diese Ausnahme kann auftreten, wenn Matcher mit Rohwerten kombiniert werden:
// falsch: irgendeinemethode (ANYOBJECT(), "rohe Zeichenfolge");

Wenn Matcher verwendet werden, müssen alle Argumente von Matching-Programmen zur Verfügung gestellt werden.
Zum Beispiel:
// richtig:
someMethod (anyObject(), eq ("String by matcher"));

Für weitere Informationen siehe Javadoc für Matchers-Klasse.

Wenn ich dies aber tun:

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

es nicht mehr das Problem hat. Dies scheint jedoch nicht das zu erreichen, was ich möchte - ich möchte den Wert zurückgeben, wenn die Methode mit einem Objekt vom Typ DBObject aufgerufen wird.

Gedanken?

+0

Siehe '[EDIT]' Teil der ersten Antwort. Vielleicht hast du dasselbe Problem? http://stackoverflow.com/questions/10828843/powermockito-got-invaliduseofmatchersexception-when-use-matchers-mocking-static – bezmax

+0

Also ist DBCollection ein Mockito Mock-Objekt? –

Antwort

13

Ich denke, Ihre Ergebnisse sind kompatibel mit dem Ergebnis, das passieren würde, wenn dbCollection kein Mockito-Mock (oder Ihre Methode ist statisch oder endgültig). Das würde bedeuten, dass ein Matcher verwendet wird, wo keiner verwendet werden kann; daher die "0 Matcher erwartet, 1 aufgezeichnet".

+0

Es ist ein Mock (DBCollection.class) – Paul

+2

Aber (angenommen das ist MongDB) es sieht aus wie [DBCollection # find() '] (http://api.mongodb.org/java/2.6/com/mongodb/DBCollection. html # find (com.mongodb.DBObject)) ist endgültig, was den gleichen Effekt hat. Sie können endgültige Methoden nicht verspotteten, ohne [PowerMock] (http://code.google.com/p/powermock/) zu verwenden. –

+0

Es ist in der Tat eine endgültige Methode, danke für die Klärung, dass für mich! – Paul