Mocking einen Anruf auf eine öffentliche Methode einer abstrakten Klasse ohne Unterklassen der abstrakten Klasse, mit mockito prefererably
Ich bin schreiben eines unit Tests mit JUNIT + Mockito testen eine Methode wie :
public someObject methodUnderTest(){
SomeObject obj = SomeAbstractClass.someMethod();
if(obj!=null){
obj.someOtherMethod();
}
return someThing;
}
Und ich möchte mock den Anruf auf abstract Class "SomeAbstractClass"
erwähnt im obigen code-fragment, so kann ich überprüfen, rufen Sie auf "obj" wie :
verify(SomeAbstractClass).someMethod();
verify(obj).someOtherMethod();
Habe ich versucht, mit Hilfe von mockito features wie :
Mockito.CALLS_REAL_METHODS
Mockito.RETURNS_MOCKS
aber Sie arbeiten nicht aufgrund von Abhängigkeiten nicht verfügbar sind, um die SomeAbstractClass.
Hinweis:
1) SomeObject ist eine Schnittstelle.
2.) brauche ich eine Technik, um zu testen, obigen code-fragment. Ich bin gezwungen, mit dem obigen code-fragment und keine änderungen an der code-fragment.
InformationsquelleAutor Mrugen Deshmukh | 2012-05-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Annahme: wenn Sie schreiben unit-Tests, ich denke, man kann immer noch ändern erprobte Methode ein wenig.
Lösung:
InformationsquelleAutor volkovs
Können Sie PowerMock zu verspotten, statischen und finalen Methoden.
InformationsquelleAutor Garrett Hall
Es klingt wie das problem ist, dass die Nutzung von CALLS_REAL_METHODS, ist die Anwendung auf die gesamte Klasse, wo Sie wirklich wollen, zu verspotten, bestimmte Methoden (d.h. machen Sie eine "Teil-mock"). Sie haben hier zwei Optionen, eine mit
thenCallRealMethod
, und einer mitCALLS_REAL_METHODS
und dann gezielt machten Sie sich über die Anrufe, die Sie brauchen:Gewarnt, dass SomeAbstractClass ist eigentlich nie instanziiert, so dass, wenn Sie verlassen sich auf jedes Verhalten in die abstrakte Klasse Konstruktor, wie die Initialisierung der Variablen-einschließlich inline-Initialisierung, wo die Felder deklariert sind-Sie müssen diese Aufrufe explizit selbst.
InformationsquelleAutor Jeff Bowman
Verwendung von anonymen Klassen:
Sie können eine anonyme Klasse für ein interface (wie SomeObject) zu - siehe Antwort bearbeitet
InformationsquelleAutor Bohemian