Schreibtests für Spring MVC-Controller:Testfall 101
Im vorherigen Teil meines neuen Spring MVC Test-Tutorials haben wir gelernt, wie wir das zu testende System konfigurieren können, wenn wir Unit-Tests für "normale" Spring MVC-Controller schreiben. Wir haben auch gelernt, dass wir, wenn wir unseren Testklassen keinen doppelten Code hinzufügen möchten, HTTP-Anforderungen mithilfe von Request-Builder-Klassen an das zu testende System senden sollten. Bevor wir jedoch die Request-Builder-Methoden implementieren können, die HTTP-Anforderungen erstellen und an das zu testende System senden, müssen wir Folgendes verstehen:
- Wie wir HTTP-Anfragen senden können, indem wir den
MockMvc
verwenden Klasse. - Wie wir Zusicherungen für die zurückgegebene HTTP-Antwort schreiben können.
Leider ist dieses Thema so umfangreich, dass es nicht in einem Blogbeitrag behandelt werden kann. Deshalb bietet dieser Blogbeitrag einen sehr schnellen Einstieg in dieses Thema und die nächsten Teile dieses Tutorials liefern "richtige" Antworten auf diese Fragen.
Fangen wir an.
Die Grundstruktur eines automatisierten Tests
Wenn wir einen automatisierten Test für einen Spring MVC-Controller schreiben möchten, müssen wir die folgenden Schritte ausführen:
- Erstellen Sie eine
RequestBuilder
Objekt, das angibt, welche Art von HTTP-Anforderung an das zu testende System gesendet wird. - Senden Sie eine HTTP-Anforderung an das zu testende System, indem Sie
perform()
aufrufen Methode desMockMvc
Klasse, und übergeben Sie den erstelltenRequestBuilder
Objekt als Methodenparameter. - Schreiben Sie Behauptungen für die zurückgegebene HTTP-Antwort, indem Sie den
ResultActions
verwenden Objekt, das vonperform()
zurückgegeben wird Methode desMockMvc
Klasse. Wir können eine Assertion für die zurückgegebene HTTP-Antwort schreiben, indem wirandExpect()
aufrufen Methode desResultActions
Schnittstelle. Wenn wir diese Methode aufrufen, müssen wir einen neuenResultMatcher
erstellen Objekt und übergeben Sie dieses Objekt als Methodenparameter.
Der Pseudo-Code unseres automatisierten Tests sieht wie folgt aus:
mockMvc.perform( //Specify what kind of an HTTP request is send to the system under test ) .andExpect( //Write an assertion for the returned HTTP response )
Als Nächstes erfahren wir, wie wir angeben können, welche Art von HTTP-Anfrage an das zu testende System gesendet wird.
Festlegen der HTTP-Anforderung, die an das zu testende System gesendet wird
Wenn wir die HTTP-Anforderung angeben möchten, die an das zu testende System gesendet wird, müssen wir eine statische Factory-Methode des MockMvcRequestBuilders
aufrufen Klasse. Diese Klasse stellt Factory-Methoden bereit, mit denen wir GET
senden können , POST
, PUT
, PATCH
, DELETE
, OPTIONS
, und HEAD
Anfragen an das zu testende System. Alle Factory-Methoden geben ein MockHttpServletRequestBuilder
zurück Objekt, das an perform()
übergeben werden kann Methode des MockMvc
Klasse als Methodenparameter.
Wenn wir eine Fabrikmethode aufrufen, die einen neuen MockHttpServletRequestBuilder
erstellt Objekt müssen wir zwei Methodenparameter an die aufgerufene Methode übergeben. Diese Methodenparameter sind:
- Eine URI-Vorlage, die das Format verwendet, das von
UriComponentsBuilder
unterstützt wird Klasse. - Null oder mehr URI-Variablenwerte. Diese Werte werden verwendet, um die aus der URI-Vorlage gefundenen Variablen zu ersetzen, indem das FIFO-Prinzip (first in, first out) verwendet wird.
Schauen wir uns zwei Beispiele an, die zeigen, wie wir die Factory-Methoden des MockMvcRequestBuilders
verwenden können Klasse.
Beispiel 1:
Wenn wir einen GET
senden wollen Anfrage an den Pfad:'/api/task/1', müssen wir den get()
aufrufen Methode des MockMvcRequestBuilders
Klasse. Nachdem wir diese Methode aufgerufen haben, sieht der Pseudo-Code unseres automatisierten Tests wie folgt aus:
mockMvc.perform(get("/api/task/{id}", 1L)) .andExpect( //Write an assertion for the returned HTTP response )
Beispiel 2:
Wenn wir eine PUT-Anfrage an den Pfad:'/api/user/99/task/1' senden wollen, müssen wir den put()
aufrufen Methode des MockMvcRequestBuilders
Klasse. Nachdem wir diese Methode aufgerufen haben, sieht der Pseudo-Code unseres automatisierten Tests wie folgt aus:
mockMvc.perform(put("/api/user/{userId}/task/{taskId}", 99L, 1L)) .andExpect( //Write an assertion for the returned HTTP response )
Wir können jetzt die Struktur eines automatisierten Tests beschreiben, der das Spring MVC Test-Framework verwendet, und wir können eine einfache HTTP-Anforderung an das zu testende System senden. Fassen wir zusammen, was wir aus diesem Blogbeitrag gelernt haben.
Zusammenfassung
Dieser Blogbeitrag hat uns drei Dinge gelehrt:
- Wir können eine HTTP-Anfrage an das zu testende System senden, indem wir
perform()
aufrufen Methode desMockMvc
Klasse. - Wir können einen neuen
MockHttpServletRequestBuilder
erstellen -Objekt, das es uns ermöglicht, die HTTP-Anforderung zu erstellen, die an das zu testende System gesendet wird, indem wir die statischen Factory-Methoden vonMockMvcRequestBuilders
verwenden Klasse. - Wenn wir den Request-URI angeben, sollten wir die Syntax verwenden, die von
UriComponentsBuilder
unterstützt wird Klasse.