Beim Ausführen der Tests wird folgende Ausnahme angezeigt. Ich benutze Mockito zum Verspotten. Die von der Mockito-Bibliothek erwähnten Hinweise helfen nicht weiter.
org.mockito.exceptions.misusing.UnfinishedStubbingException:
Unfinished stubbing detected here:
-> at com.a.b.DomainTestFactory.myTest(DomainTestFactory.java:355)
E.g. thenReturn() may be missing.
Examples of correct stubbing:
when(mock.isOk()).thenReturn(true);
when(mock.isOk()).thenThrow(exception);
doThrow(exception).when(mock).someVoidMethod();
Hints:
1. missing thenReturn()
2. you are trying to stub a final method, you naughty developer!
at a.b.DomainTestFactory.myTest(DomainTestFactory.java:276)
..........
Testcode von DomainTestFactory
. Wenn ich den folgenden Test durchführe, wird die Ausnahme angezeigt.
@Test
public myTest(){
MyMainModel mainModel = Mockito.mock(MyMainModel.class);
Mockito.when(mainModel.getList()).thenReturn(getSomeList()); // Line 355
}
private List<SomeModel> getSomeList() {
SomeModel model = Mockito.mock(SomeModel.class);
Mockito.when(model.getName()).thenReturn("SomeName"); // Line 276
Mockito.when(model.getAddress()).thenReturn("Address");
return Arrays.asList(model);
}
public class SomeModel extends SomeInputModel{
protected String address;
protected List<SomeClass> properties;
public SomeModel() {
this.Properties = new java.util.ArrayList<SomeClass>();
}
public String getAddress() {
return this.address;
}
}
public class SomeInputModel{
public NetworkInputModel() {
this.Properties = new java.util.ArrayList<SomeClass>();
}
protected String Name;
protected List<SomeClass> properties;
public String getName() {
return this.Name;
}
public void setName(String value) {
this.Name = value;
}
}
Antworten:
Du nistest Spott in Spott. Sie rufen an
getSomeList()
, was einige Verspottungen macht, bevor Sie die Verspottung beendet habenMyMainModel
. Mockito mag es nicht, wenn Sie dies tun.Ersetzen
mit
Um zu verstehen, warum dies ein Problem verursacht, müssen Sie ein wenig über die Funktionsweise von Mockito wissen und wissen, in welcher Reihenfolge Ausdrücke und Anweisungen in Java ausgewertet werden.
Mockito kann Ihren Quellcode nicht lesen. Um herauszufinden, was Sie von ihm verlangen, hängt er stark vom statischen Status ab. Wenn Sie eine Methode für ein Scheinobjekt aufrufen, zeichnet Mockito die Details des Aufrufs in einer internen Liste von Aufrufen auf. Die
when
Methode liest den letzten dieser Aufrufe aus der Liste und zeichnet diesen Aufruf in dem zurückgegebenenOngoingStubbing
Objekt auf.Die Linie
verursacht die folgenden Wechselwirkungen mit Mockito:
mainModel.getList()
heißt:when
heißt,thenReturn
wird für dasOngoingStubbing
von derwhen
Methode zurückgegebene Objekt aufgerufen .Die
thenReturn
Methode kann dann den über dieOngoingStubbing
Methode empfangenen Mock anweisen , jeden geeigneten Aufruf der zurückzugebendengetList
Methode zu verarbeitensomeModelList
.Da Mockito Ihren Code nicht sehen kann, können Sie Ihre Verspottung auch wie folgt schreiben:
Dieser Stil ist etwas weniger klar zu lesen, zumal in diesem Fall der
null
gegossen werden muss, aber er erzeugt die gleiche Abfolge von Interaktionen mit Mockito und erzielt das gleiche Ergebnis wie die obige Zeile.Allerdings ist die Linie
verursacht die folgenden Wechselwirkungen mit Mockito:
mainModel.getList()
heißt:when
heißt,mock
vonSomeModel
wird erstellt (innengetSomeList()
),model.getName()
heißt:An diesem Punkt wird Mockito verwirrt. Es dachte, Sie verspotten
mainModel.getList()
, aber jetzt sagen Sie, dass Sie diemodel.getName()
Methode verspotten wollen . Für Mockito sieht es so aus, als würden Sie Folgendes tun:Das sieht albern aus,
Mockito
da es nicht sicher sein kann, womit Sie es machenmainModel.getList()
.Beachten Sie, dass wir nicht zum
thenReturn
Methodenaufruf gelangt sind , da die JVM die Parameter dieser Methode auswerten muss, bevor sie die Methode aufrufen kann. In diesem Fall bedeutet dies, diegetSomeList()
Methode aufzurufen .Im Allgemeinen ist es eine schlechte Entwurfsentscheidung, sich wie Mockito auf den statischen Zustand zu verlassen, da dies zu Fällen führen kann, in denen das Prinzip des geringsten Erstaunens verletzt wird. Mockitos Design sorgt jedoch für klare und ausdrucksstarke Verspottung, auch wenn es manchmal zu Erstaunen führt.
Schließlich fügen neuere Versionen von Mockito der obigen Fehlermeldung eine zusätzliche Zeile hinzu. Diese zusätzliche Zeile zeigt an, dass Sie sich möglicherweise in derselben Situation wie diese Frage befinden:
quelle
Versuchen Sie zum Verspotten von Void-Methoden Folgendes:
quelle