Betrachten Sie das folgende Beispiel MockUp
einer Klasse Foo
, das Bar
im Konstruktor abfängt und dann toString()
in Bar
;
Wenn Foo
zufällig toString()
überschreibt, funktioniert alles. Andernfalls erhalten Sie eine IllegalArgumentException
: "Passende reale Methoden wurden für die folgenden Mocks nicht gefunden". Ich verstehe von hier aus, dass JMockit nicht in Basisklassen sucht und daher keine toString()
Methode zum Mock finden kann.
Angenommen, ich kann die Foo-Klasse nicht ändern (in Wirklichkeit kann ich das, aber nur um des Arguments willen), gibt es irgendeine Möglichkeit, toString()
nur für diese Foo
-Klasse vorzuspielen?
Um klar zu sein, möchte ich alle Instanzen dieser Klasse vortäuschen, nicht nur eine Instanz (mit einfachen Lösungen, die kein MockUp
benötigen).
JMockit verspottet alle Superklassen in der Klassenhierarchie bis , aber ausschließlich java.lang.Object
.
Sie könnten in Ihrem Test die Klasse private final
definieren, die Bar
durch Überschreiben von toString()
, die an Bar
s toString()
delegiert, erweitert, indem Sie super.toString()
:
Jetzt musst du nur noch in deinem Mock über Baz
nicht Bar
delegieren.
Auf diese Weise haben Sie eine konkrete und dennoch transparente Implementierung von toString()
erhalten, die Sie vortäuschen können, ohne die Bar
-Klasse zu berühren, die Sie möglicherweise nicht kontrollieren können.
Tags und Links java unit-testing mocking jmockit