Wie überprüft man String im Antworttext mit mockMvc?
Habe ich einfache integration test
@Test
public void shouldReturnErrorMessageToAdminWhenCreatingUserWithUsedUserName() throws Exception {
mockMvc.perform(post("/api/users").header("Authorization", base64ForTestUser).contentType(MediaType.APPLICATION_JSON)
.content("{\"userName\":\"testUserDetails\",\"firstName\":\"xxx\",\"lastName\":\"xxx\",\"password\":\"xxx\"}"))
.andDo(print())
.andExpect(status().isBadRequest())
.andExpect(?);
}
In der letzten Zeile möchte ich vergleichen Zeichenfolge als Antwort erhaltenen Körper zu erwarten string
Und als Antwort bekomme ich:
MockHttpServletResponse:
Status = 400
Error message = null
Headers = {Content-Type=[application/json]}
Content type = application/json
Body = "Username already taken"
Forwarded URL = null
Redirected URL = null
Versuchte einige tricks, mit Inhalt(), body (), aber nichts hat funktioniert.
Kommentar zu dem Problem
Nur als Ratschlag, 400 status-code sollte nicht zurückgegeben werden, für so etwas wie
"Benutzername bereits vergeben"
. Das sollte mehr ein 409 Konflikt. Danke - das Ziel dieses Tests ist die Angabe, solche Dinge.
InformationsquelleAutor der Frage pbaranski | 2013-08-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie anrufen
andReturn()
und die zurückgegebenenMvcResult
Objekts, um den Inhalt alsString
. Siehe unten:InformationsquelleAutor der Antwort Sotirios Delimanolis
@Sotirios Delimanolis Antwort, die den job tun, aber ich war auf der Suche für den Vergleich von Zeichenfolgen innerhalb dieser mockMvc Behauptung
Also hier ist es
Natürlich meine Behauptung fehl:
weil:
So ist dies der Beweis, dass es funktioniert!
InformationsquelleAutor der Antwort pbaranski
Frühjahr MockMvc hat nun direkte Unterstützung für JSON. So kann man einfach sagen:
und im Gegensatz zu string-Vergleich, es wird etwas sagen wie "fehlendes Feld xyz" oder "Nachricht Erwartet 'ok', 'nok'.
Diese Methode wurde eingeführt, im Frühjahr 4.1.
InformationsquelleAutor der Antwort vertti
Lesen dieser Antworten, ich kann sehen, eine Menge in Bezug auf Spring version 4.x, ich bin mit der version 3.2.0 aus verschiedenen Gründen. So Sachen wie json-Unterstützung direkt aus der
content()
ist nicht möglich.Ich fand, dass mit
MockMvcResultMatchers.jsonPath
ist wirklich einfach und arbeitet ein Genuss. Hier ist ein Beispiel Test ein post-Methode.Den bonus mit dieser Lösung ist, dass Sie immer noch passender auf Attribute, nicht unter Berufung auf die vollständige json-string Vergleiche.
(Mit
org.springframework.test.web.servlet.result.MockMvcResultMatchers
)Den request-body war einfach eine json-Zeichenfolge, die können Sie ganz einfach laden Sie von einem echten json-mock-Daten-Datei, wenn Sie wollte, aber ich habe nicht gehört, dass hier, wie es hätte abgelenkt von der Frage.
Den eigentlichen json zurückgegeben hätte so ausgesehen:
InformationsquelleAutor der Antwort Jeremy
Spring security ist
@WithMockUser
und hamcrest istcontainsString
matcher sorgt für eine einfache und elegante Lösung:Weitere Beispiele auf github
InformationsquelleAutor der Antwort Mick
Diese sollten geben Sie den Körper die Antwort. "Benutzername bereits vergeben" in Ihrem Fall.
InformationsquelleAutor der Antwort justAnotherGuy
Entnommen spring tutorial
is
ist vonimport static org.hamcrest.Matchers.*;
jsonPath
ist vonimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
sowie
jsonPath
Referenz gefunden werden kann hierInformationsquelleAutor der Antwort user2829759
Für die überprüfung der endgültigen html-Ergebnis, können Sie die ganze HTML-Ausgabe, indem Sie den folgenden code, und überprüfen Sie die Nachrichten in es:
rest Vorlage sollte autowired:
und assertThat importiert werden muss als statische Methode:
InformationsquelleAutor der Antwort AliReza19330