The style for this post is tabled by Terminal CSS
⌂ Home

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.

Was wenn wir Dubletten in der Liste haben wollen, Schlaumeier?