Integrationstests von Spring MVC Kontrollern mit MockMVC

Dieser Artikel soll kurz zeigen, wie Spring Mvc Rest-Controller mit dem MockMvc Framework getestet werden können. Dafür mit nehmen wir einen einfachen Kontroller mit 3 Rest-Endpunkte:

  • Erstellen eines Todo Eintrags  createTodoItem(@RequestBody TodoDTO todoDTO, HttpServletRequest request)
  • Abrufen aller Todo Einträge findToDoEntities()
  • Abrufen einen Todo Eintrag mit der ID findToDoEntities(@PathVariable long id)

Das folgende Codelisting zeigt die gesamte Testklasse. Anschließend gehen wir auf die einzelnen Testmethode genauer ein.

Wesentlich für das Laufen der Integrationstests sind drei Annotationen an der Testklasse um den Spring Kontext hochzufahren und um das MockMvc Framework bereitzustellen:

  • Die Annotation @SpringBootTest sorgt dafür, dass der Spring ApplicationContext für die Testumgebung hochgefahren wird.
  • Die Annotation @AutoConfigureMockMvc konfiguriert das MockMVC Framework und stellt ein Bean bereit, dass wir in das Feld mockMvc  injizieren.
  • Die Annotation @RunWith(SpringRunner.class) informiert JUnit beim Ausführen der Tests der Spring Test Support eingebunden werden soll.

Das MockMvc Framework stellt eine recht übersichtliche Fluent-style Builder API bereit um die auszuführende Aktion und die Erwartungen bezüglich des Rückgabewertes zu konfigurieren. Der Aufrufe an die Controller aus dem MockMvc Framework heraus geschieht dabei genau so als ob der Controller von außen aufgerufen wurde, z.B. mit Postman.

Get Request

Im einfachsten Fall, wird ein Controller mit einem GET Request aufgerufen (Zeile 4). Als Antwort erwarten den HttpStatus 200 (OK)  (Zeile 5) und einen Content-Type der mit „application/json“ kompatibel ist (Zeile 6). Im Body der Antwort erwarten wir ein Array mit einem Element (Zeile 7). Dieses Element hat zwei Properties „subject“ und „description“ mit den Werten die in den Konstanten EXPECTED_SUBJECT und EXPECTED_DESCRIPTION gespeichert sind.

Ist die Antwort wie erwartet und der Test läuft durch, wird er wie ein normaler Unit Test mit „Ok“ markiert. Im Fehlerfall wird eine aussagekräftige Fehlermeldung angezeigt:

Den Rest Controller, der eine ID benötigt und einen konkreten eine bestimmten Todo Eintrag liefert, prüfen wir analog. Der einzige Unterschied ist, das wir in der URL die ID mitgeben (Zeile 4) und prüfen, das nur ein Element mit den erwarteten Werten zurückkommt.

Senden von Daten mit Post Request

Als nächstes wollen wir den Controller zum Anlegen eines neuen Elementes testen.

Wir prüfen, dass im Fehlerfall, bei dem keine Daten im Body mitgeschickt werden ein HttpStatus 400 (Bad Request) zurückkommt (Zeile 3), und die save Methode nicht aufgerufen wird (Zeile 4).

Um den Erfolgsfall zu prüfen, müssen wir im Request Body die erforderlichen Daten mitschicken. Diese haben wir in einer Datei im Test Resources Verzeichnis abgelegt. Den Inhalt dieser Datei lesen wir als String ein (Zeile 3) und schicken in im Post Request mit (Zeile 8). Hier erwarten wir als Response den HttpStatus 201 („Created“) und einen Header mit Namen „location“ und mit der Wert enthält die aufgerufene URL.

Anschließend verifizieren wir, dass beim Ausführen des PostRequests die Methode todoRepository.save()  an unserem Mockobjekt aufgerufen wurde (Zeile 11). Wir können zusätzlich den Aufrufparameter der save Methode prüfen. Dafür müssen wir den Paramter mit einem ArgumentCaptor festhalten (Zeile 11, 12) um dessen Werte prüfen zu können (Zeile 14, 15).

Weiterführende Informationen sind auf den Spring Guides Seiten verfügbar.

Weiterhin ist der hier aufgeführte Code in unserem Github-Repository einzusehen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.