Mockito's Konivenz mit Stubs
Auf dem Weg zum glorreichen gruenen Test sieht man sich manches mal gezwungen Stellvertreter einzusetzen und Mockito schaut diesen Stellvertretern strikt auf die Finger. Einmal definiert, duerfen sie auch nur nach Definition gerufen werden, wobei das wachsame Auge von Mockitor auch nicht vor Listen und ihrem Inhalt halt macht.
doReturn(foo).when(mockedService).method(List.of("one", "two", "three"))
Sollte unser Code, aus unerfindlichen Businessgruenden nichts auf die Reihenfolge der Parameter geben, und frecherweise den Service so rufen
mockedService.method(List.of("three", "two", "one"))
wird uns Mockito beiseite nehmen und mit geduldigem Unmut darauf hinweisen, wie man denn auf die Idee kommen kann Spezifikationen zu brechen
Versprochen ist versprochen und wird auch nicht gebrochen
Wege aus dem Schwitzkasten
Stubs schlampig erstellen lassen
Mockito laueft standardmaessig im autoritaeren strict stubbing mode, der uns im obigen Fall nicht mehr weiter testen laesst, laesst sich aber dazu ueberreden mal ein Auge zu zu druecken
Mockito
.lenient()
.doReturn(foo).when(mockedService).method(List.of("one", "two", "three"))
[!danger] Die Macher von Mockito hatten ihre Gruende, Stubaufrufe strikt zu pruefen. Sie sind davon ueberzeugt dass die Funktionalitaet dabei hilft robusten Code hinzustellen. Wenn wir uns dazu entscheiden, die Massnahmen von Koepfen zu unterwandern, die sich mit einem Thema wahrscheinlich besser auskennen als wir, sollten wir einen triftigen Grund dafuer haben
Das Listenargument nicht exakt am Mock definieren
Anstatt Mockito haarklein vorzugeben wie der zu mockende Aufruf aussehen soll, koennen wir einfach angeben dass die Liste irgendwie aussehen kann (hauptsache es ist eine da)
doReturn(foo).when(mockedService).method(anyList())
[!note] Ich bin mit dieser Variante gegangen. Teilweise weil sich meine Faulheit in eine eigene, von mir unabhaengige Persoenlichkeit abgespalten hat, teilweise weil es fuer meinen Test zu der Zeit schlichtweg wumpe war, was in der Liste stand. In den meisten Faellen ist es jedoch keine schlechte Idee mit zu pruefen ob unser Code den wir testen den Service auch richtig bedient.
In unserem Code auf eine Datenstruktur umstellen die keine Eigenschaft bzgl. der Reihenfolge hat
Da Mockito zum Vergleich der Argumente equals
hernimmt, koennen wir, falls unser Businesscode in der Tat einen @#$ auf die Reihenfolge in der Liste gibt, statt einer Liste, ein Set verwenden.