2015-09-26 12 views
9

Betrachten Sie das folgende Beispiel MockUp einer Klasse Foo, die Bar im Konstruktor abfängt und dann implementiert toString() in Bezug auf Bar;Kann JMockit MockUp mock toString()?

public class FooStub extends MockUp<Foo> { 

    private Bar bar; 

    @Mock 
    public void $init(Bar bar) { 
     this.bar = bar; 
    } 

    @Mock 
    public String toString() { 
     return bar.toString(); 
    } 
} 

Wenn Foo geschieht toString() alles funktioniert gut außer Kraft zu setzen. Andernfalls erhalten Sie eine IllegalArgumentException: "Passende reale Methoden nicht für die folgenden Mocks 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, aber nur aus Gründen der Argumentation), gibt es eine Möglichkeit toString() nur für diese Foo Klasse zu verspotten?

Um klar zu sein, möchte ich alle Instanzen dieser Klasse zu verspotten, nicht nur eine Instanz (die einfache Lösungen, die keine MockUp erfordern).

+2

Mögliches Duplikat von [Jmockit: Methode zu String der Klasse net.android.Uri kann nicht verspottet werden] (https://stackoverflow.com/questions/41561351/jmockit-cant-mock-method-tostring-of-net- Android-Uri-Klasse) – Jotunacorn

Antwort

0

JMockit alle super-Klassen verspotten die Klassenhierarchie nach oben bis zu, aberjava.lang.Object ausgenommen.

Sie könnten private final-Klasse im Test definieren, die durch zwingende toString()Bar erstreckt, die Delegierten Bar ‚s toString() von super.toString() Aufruf:

private final class Baz extends Bar { 
    @Override 
    public String toString() { 
     return super.toString(); 
    } 
} 

Jetzt alles, was Sie in Ihrem Mock tun müssen, ist über Baz zu delegieren nicht Bar.

Auf diese Weise erhalten Sie konkrete und dennoch transparente Implementierung von toString(), die Sie spottet, ohne Bar Klasse zu berühren, die möglicherweise außerhalb Ihrer Kontrolle ist.

Verwandte Themen