Ich habe einen einfachen Integrationstest
@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 die im Antworttext empfangene Zeichenfolge mit der erwarteten Zeichenfolge vergleichen
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 content (), body (), aber nichts funktionierte.
java
spring
mocking
spring-test-mvc
pbaranski
quelle
quelle
"Username already taken"
. Das sollte eher ein 409-Konflikt sein.Antworten:
Sie können
andReturn()
das zurückgegebeneMvcResult
Objekt aufrufen und verwenden , um den Inhalt als zu erhaltenString
.Siehe unten:
quelle
@RestController
gibt an, dass alle Handler-Methoden implizit mit Anmerkungen versehen sind@ResponseBody
. Dies bedeutet, dass Spring a verwendet,HttpMessageConverter
um den Rückgabewert des Handlers zu serialisieren und in die Antwort zu schreiben. Sie können sehr viel den Körper mit bekommencontent()
.getContentAsString()
, der von meinem@RestController
annotierten Controller zurückgegeben wurde.result.getResponse().getErrorMessage()
andReturn
a zurückMvcResult
, wie im Javadoc hier angegeben .@Sotirios Delimanolis Antwort erledigt den Job, aber ich suchte nach einem Vergleich von Zeichenfolgen innerhalb dieser mockMvc-Behauptung
Hier ist es also
Natürlich scheitert meine Behauptung:
weil:
Das ist also ein Beweis dafür, dass es funktioniert!
quelle
.andExpect(content().string(containsString("\"Username already taken");
org.hamcrest.Matchers.containsString()
.org.hamcrest.Matchers.equalToIgnoringWhiteSpace()
Matcher auch verwendet , um alle Leerzeichen zu ignorieren. Vielleicht ist es ein nützlicher Tipp für jemandenSpring MockMvc unterstützt jetzt direkt JSON. Also sagst du einfach:
und im Gegensatz zum String-Vergleich wird so etwas wie "fehlendes Feld xyz" oder "Nachricht erwartet" angezeigt.
Diese Methode wurde im Frühjahr 4.1 eingeführt.
quelle
ContentRequestMatchers
diese Funktion nicht ebenfalls unterstützen?Wenn ich diese Antworten lese, sehe ich viel in Bezug auf Spring Version 4.x. Ich verwende Version 3.2.0 aus verschiedenen Gründen. Dinge wie json support direkt von der
content()
sind also nicht möglich.Ich fand, dass die Verwendung
MockMvcResultMatchers.jsonPath
wirklich einfach ist und ein Vergnügen ist. Hier ist ein Beispiel zum Testen einer Post-Methode.Der Vorteil dieser Lösung besteht darin, dass Sie immer noch mit Attributen übereinstimmen und sich nicht auf vollständige Vergleiche mit JSON-Zeichenfolgen verlassen.
(Verwenden
org.springframework.test.web.servlet.result.MockMvcResultMatchers
)Der Anfragetext war nur eine JSON-Zeichenfolge, die Sie leicht aus einer echten JSON-Mock-Datendatei laden können, wenn Sie möchten, aber ich habe das hier nicht aufgenommen, da es von der Frage abgewichen wäre.
Der tatsächlich zurückgegebene JSON hätte folgendermaßen ausgesehen:
quelle
Entnommen aus dem Tutorial des Frühlings
is
ist erhältlich beiimport static org.hamcrest.Matchers.*;
jsonPath
ist erhältlich beiimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
und
jsonPath
Referenz finden Sie hierquelle
error: incompatible types: RequestMatcher cannot be converted to ResultMatcher
für.andExpect(content().contentType(contentType))
@WithMockUser
DercontainsString
Matcher von Spring Security und Hamcrest bietet eine einfache und elegante Lösung:Weitere Beispiele zu Github
quelle
Hier ist ein Beispiel, wie Sie die JSON-Antwort analysieren und sogar eine Anforderung mit einer Bean in JSON-Form senden:
Wie Sie hier sehen können,
Book
ist dies ein Anforderungs-DTO undUpdateBookResponse
ein Antwortobjekt, das von JSON analysiert wurde. Möglicherweise möchten Sie dieObjectMapper
Konfiguration des Jakson ändern .quelle
Dies sollte Ihnen den Hauptteil der Antwort geben. "Benutzername bereits vergeben" in Ihrem Fall.
quelle
hier eine elegantere Art und Weise
quelle
Sie können die Methode 'getContentAsString' verwenden, um die Antwortdaten als Zeichenfolge abzurufen.
Sie können diesen Link für die Testanwendung verwenden.
quelle
Ein möglicher Ansatz besteht darin, einfach die
gson
Abhängigkeit einzuschließen:und analysieren Sie den Wert, um Ihre Überprüfungen vorzunehmen:
quelle