Ist es möglich, alle Methodenaufrufe auf einem Mock generisch abzufangen?Mockito - Abfangen eines beliebigen Methodenaufrufs auf einen Schein
Beispiel
einen Anbieter bereitgestellt Klasse wie Gegeben:
public class VendorObject {
public int someIntMethod() {
// ...
}
public String someStringMethod() {
// ...
}
}
Ich möchte ein mock schaffen, die lenkt erneut alle Verfahren zu einer anderen Klasse aufruft, wo es Verfahren passen Signaturen:
public class RedirectedToObject {
public int someIntMethod() {
// Accepts re-direct
}
}
Die when(). thenAnswer() Konstrukt t in Mockito scheint die Rechnung zu erfüllen, aber ich finde keine Möglichkeit, einen Methodenaufruf mit irgendwelchen Argumenten zu vergleichen. Die InvocationOnMock gibt mir jedenfalls alle diese Details. Gibt es einen generischen Weg, dies zu tun? Etwas, das wie folgt aussehen würde, wo die, wenn sie mit entsprechendem Code ersetzt wird (vo. *):
VendorObject vo = mock(VendorObject.class);
when(vo.anyMethod(anyArgs)).thenAnswer(
new Answer() {
@Override
public Object answer(InvocationOnMock invocation) {
// 1. Check if method exists on RedirectToObject.
// 2a. If it does, call the method with the args and return the result.
// 2b. If it does not, throw an exception to fail the unit test.
}
}
);
Hinzufügen Wrapper um die Herstellerklassen leicht zu machen spöttischen ist keine Option, weil:
- Eine zu große vorhandene Codebasis.
- Teil extrem leistungskritischer Anwendungen.
Sag mir nicht, es ist so einfach wie (Vo) .thensAntwort (...): O – Karle
"Teil extrem leistungskritischen Anwendungen." Wie sieht das Hinzufügen eines Mock/Proxy-Objekts anders aus als das Hinzufügen eines Wrappers in diesem Fall? Interessieren Sie sich nur für Unit-Tests oder in der eigentlichen App? –
@mattb: Der Leistungsaspekt ist nicht das größte Argument gegen die Verwendung von Wrapper-Klassen. Wir würden eine Schnittstelle basierend auf dem ursprünglichen Lieferantenobjekt und einer Implementierungsklasse erstellen, die Anforderungen an das tatsächliche Lieferantenobjekt weiterleitet. Die Ausführungszeit dafür ist im Vergleich zu dem tatsächlichen Anbieterobjekt, das seine Arbeit ausführt, gering. Das wichtigere Argument ist die vorhandene Codebasis, die die Lieferantenobjekte direkt verwendet. – Karle