Page tree
Skip to end of metadata
Go to start of metadata
Inhalt

Verweise

 

STATUS

Einleitung

Wenn ich ein gelayertes System habe möchte ich auf der Ebene i nicht die Klassen aus i-1 mit testen. Ich gehe davon aus, dass sie getestet sind und sich so verhalten wie spezifiziert. In diesem Fall kann ich das Verhalten der Klasse aus i-1 mocken.

Hier ein einfaches Beispiel

Controller testen

In Zeile 5 wird ein Service injeziert. Dieser Service soll in dem Test dieser Methode nicht mitgetestet werden. Sie besitzt bereits einen eigenen Test.

Was soll überhaupt getestet werden

Gerade bei Controllern werde ich oft gefragt: Was soll denn da genau getestet werden. Dreierlei:

  1. Ich möchte sicher stellen, dass der Controller die Servicemethode userService.findAllUsers() auch wirklich aufruft. Denn nur dann kann eine Liste zurückgegeben werden.
  2. Ich möchte das Verhalten des Controllers im Fehlerfall ermitteln. Das erscheint mir zu komplex alles mit Integrationstests zu testen.
  3. Ich möchte gucken, ob die Rückgabewerte vollständig sind.

Tatsächlich erspare ich mir Integrationstests, wenn die das Verhalten eines Controllers vollständig mit einem Unittest verifiziere. Der Integrationstest muss dann nur noch den "Happy-Path" abprüfen und ich bin fertig.

Mockito einfach

Ich benutze als Mockframework Mockito. Da ich Maven als Buildtool nutze, ist Mockito schnell installiert:

Maven POM für Mockito

Da ich auch Hamcrest nutze, ggf. in einer anderen Version als Mockito, schließe ich in der Deklaration von Mockito das Hamcrest Framework als transitive Abhängigkeit explizit aus.

Der Test der obigen Funktion sieht nun mit Mockito wie folgt aus:

Einfacher Test mit Mockito

In Zeile 16 fange ich an den Test zu preparieren. Da ich den UserService nicht explizit nutzen will mocke ich ihn und injeziere genau diesen gemockten UserService in den Controller (Zeile 11). Ich spezifiziere was der Service zurückgeben soll, wenn er aufgerufen wurde.

Zeile 24 ist eigentlich redundant. Denn nur wenn diese Methode tatsächlich aufgerufen wird, kann im Response auch eine gültiger UserList zurück gegeben werden. Wichtig ist an diesem Test nicht sosehr ob der Service ausgerufen wurde sondern das Verhalten des Services. Um das Negativverhalten auch zu testen braucht es einen zweiten Test:

 

 

 

 

  • No labels