Java >> Java Tutorial >  >> Tag >> Spring

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:

  1. Erstellen Sie eine RequestBuilder Objekt, das angibt, welche Art von HTTP-Anforderung an das zu testende System gesendet wird.
  2. Senden Sie eine HTTP-Anforderung an das zu testende System, indem Sie perform() aufrufen Methode des MockMvc Klasse, und übergeben Sie den erstellten RequestBuilder Objekt als Methodenparameter.
  3. Schreiben Sie Behauptungen für die zurückgegebene HTTP-Antwort, indem Sie den ResultActions verwenden Objekt, das von perform() zurückgegeben wird Methode des MockMvc Klasse. Wir können eine Assertion für die zurückgegebene HTTP-Antwort schreiben, indem wir andExpect() aufrufen Methode des ResultActions Schnittstelle. Wenn wir diese Methode aufrufen, müssen wir einen neuen ResultMatcher 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:

  1. Eine URI-Vorlage, die das Format verwendet, das von UriComponentsBuilder unterstützt wird Klasse.
  2. 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 des MockMvc 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 von MockMvcRequestBuilders verwenden Klasse.
  • Wenn wir den Request-URI angeben, sollten wir die Syntax verwenden, die von UriComponentsBuilder unterstützt wird Klasse.

Java-Tag