Die Antwort von Tomasz Nurkiewicz scheint nicht die ganze Geschichte zu erzählen!
NB Mockito Version: 1.10.19.
Ich bin sehr ein Mockito newb, kann also das folgende Verhalten nicht erklären: Wenn es einen Experten da draußen gibt, der diese Antwort verbessern kann, fühlen Sie sich bitte frei.
Verfahren in Frage hier, getContentStringValue
ist NICHTfinal
und NICHTstatic
.
Diese Linie tutgetContentStringValue
die ursprüngliche Methode aufrufen:
doReturn("dummy").when(im).getContentStringValue(anyInt(), isA(ScoreDoc.class));
Diese Linie nicht Aufruf der ursprünglichen Methode getContentStringValue
:
doReturn("dummy").when(im).getContentStringValue(anyInt(), any(ScoreDoc.class));
Aus Gründen, die ich beantworten kann nicht, Die Verwendung von isA()
führt dazu, dass das beabsichtigte (?) "do not call method" -Verhalten von doReturn
fehlschlägt.
Schauen wir uns die hier beteiligten Methodensignaturen an: Sie sind beide static
Methoden von Matchers
. Beide werden vom Javadoc gesagt, dass sie null
zurückgeben, was ein wenig schwierig ist, sich selbst zu verstehen. Vermutlich wird das Class
Objekt, das als der Parameter übergeben wird, untersucht, aber das Ergebnis wird entweder nie berechnet oder verworfen. Vorausgesetzt, dass null
für jede Klasse stehen kann und Sie hoffen, dass die verspottete Methode nicht aufgerufen wird, konnten die Signaturen von isA(...)
und any(...)
einfach null
anstelle eines generischen Parameters zurückgeben * <T>
?
Wie dem auch sei:
public static <T> T isA(java.lang.Class<T> clazz)
public static <T> T any(java.lang.Class<T> clazz)
Die API-Dokumentation geben keine Ahnung darüber. Es scheint auch zu sagen, dass die Notwendigkeit eines solchen Verhaltens "nicht anrufen" "sehr selten" ist. Persönlich verwende ich diese Technik die ganze Zeit: in der Regel finde ich, dass Mocking beinhaltet ein paar Zeilen, die "die Szene" ... gefolgt von einem Aufruf einer Methode, die dann "spielt" die Szene in den Schein Kontext, die Sie inszeniert haben ... und während du die Szenerie und die Requisiten einrichtest ist das letzte, was du willst, dass die Schauspieler die Bühne verlassen und anfangen, ihre Herzen zu spielen ...
Aber das ist weit über meine Gehaltsstufe hinaus .. Ich lade Erklärungen von jedem vorbeikommenden Mockito-Hohepriester ein ...
* ist "allgemeiner Parameter" der rechte Ausdruck?
Was passiert, wenn ich diese Methode benutze und mein Original wird immer noch angerufen? Könnte es Probleme mit Parametern geben, die ich bestanden habe? Hier ist der ganze Test: http://pastebin.com/ZieY790P 'send' Methode heißt –
@EvgeniPetrov, wenn Ihre ursprüngliche Methode immer noch aufgerufen wird, ist es wahrscheinlich, weil Ihre ursprüngliche Methode endgültig ist. Mockito verspottet keine finalen Methoden und kann Sie nicht vor dem Spott der finalen Methoden warnen. – MarcG
ist dies auch für doThrow() möglich? – Gobliins