mockito: WrongTypeOfReturnValue (JAVA)
Habe ich erst vor kurzem angefangen mit Mockito (oder mocking/stubbing für diese Angelegenheit). Ich fange an, die hängen sich auf, wie man mock-Objekte, aber ich bin fest auf dem folgenden code:
public class ConveyorBeltTest {
private Layout layout;
@Mock private WorkStation station1;
@Mock private WorkStation station2;
@Mock private WorkStation station3;
@Mock private CarAssemblyProcess car1;
@Mock private CarAssemblyProcess car2;
@Before
public void setUp() {
layout = new Layout();
layout.getWorkStations().add(station1);
layout.getWorkStations().add(station2);
layout.getWorkStations().add(station3);
when(station1.retrievePendingTasks().size()).thenReturn(0);
when(station2.retrievePendingTasks().size()).thenReturn(2);
when(station3.retrievePendingTasks().size()).thenReturn(1);
when(station1.getCar()).thenReturn(car1);
//it's impossible to have a car in a workstation and to have pending tasks, but it's tested regardless
when(station2.getCar()).thenReturn(car2);
when(station3.getCar()).thenReturn(null);
}
Folgende Zeile wirft:
//line causing the problem
when(station1.retrievePendingTasks().size()).thenReturn(0);
//error msg
org.mockito.exceptions.misusing.WrongTypeOfReturnValue:
Integer cannot be returned by retrievePendingTasks()
retrievePendingTasks() should return Set
Es ist offensichtlich, mir zu sagen, dass es nicht erkennen kann, station1.retrievePendingTasks (), weil station1 ist kein echtes Objekt, sondern ein Schein. Aber ich dachte, wenn ich hatte eine Attrappe, ich könnte die Kette der Befehle hinter der Attrappe, die alle ja egal, solange ich das erwartete Ergebnis in thenReturn(). Kann jemand klären, was ich falsch gemacht habe hier genau?
Habe ich auch schon versucht mit:
doReturn(0).when(station1).retrievePendingTasks().size();
aber das Ergebnis ist das gleiche.
Den workaround den ich gefunden habe, ist um einen neuen Satz aus, füllen Sie es mit gespielter Elemente und übergeben, das Ergebnis retrievePendingTasks() für jede station. Das funktioniert, aber das ist schon ein bisschen extra-code Platz auf dem Bildschirm, wenn mein einziges Ziel ist es, eine Zahl für die Größe des Satzes.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du bist überspringt lustig, was retrievePendingTasks zurück und direkt lustig, was die Sache zurückgegeben hat, dass die Methode funktioniert. Wenn Sie den code ändern, um
oder etwas ähnliches, dann ist die Größe des zurückgegebenen Satz wird für sich selber sorgen.
Wenn alles, was Sie brauchen, ist die Größe dann könnte man eine mock-Implementierung von Set. Oder Sie konnte die Tiefe stubs Ansatz in skegg99 Antwort. Interessanterweise gibt es eine Einschränkung in der API-Dokumentation:
Spott Dinge, die keine Abhängigkeiten haben, vor allem Dinge wie die Java-collections, die common-Bausteine, ist meist überflüssig und machen Ihre tests zerbrechlich. Zum Beispiel hier, wenn Sie den code ändern, um die Größe bestimmen einen anderen Weg, dann, dass Ihre tests eine Pause. wenn der code zu testenden änderungen verwenden Sie einen iterator und nicht-test-Größe direkt dann Ihre test-Pausen. Oder wenn es andere Konsequenzen, dass eine leere Menge, dann haben Sie zu verspotten diejenigen, die getrennt und am Ende tut viel mehr Arbeit, und wieder zu Bruch gehen, wenn die Umsetzung änderungen. Ich versuche, mich nicht zu verspotten unnötig.
Ich glaube es nennt sich deep stubs und benötigt Besondere Pflege. Könnten Sie diese Ansatz und fügen Sie
Aber es ist besser zu umschreiben Ihre versuche, es zu vermeiden