Nach dem Upgrade auf die neu veröffentlichte 2.2.0.RELEASE
Version von Spring Boot sind einige meiner Tests fehlgeschlagen. Es scheint, dass der MediaType.APPLICATION_JSON_UTF8
veraltet ist und nicht mehr als Standardinhaltstyp von Controller-Methoden zurückgegeben wird, die den Inhaltstyp nicht explizit angeben.
Testcode wie
String content = mockMvc.perform(get("/some-api")
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
.andReturn()
.getResponse()
.getContentAsString();
funktionierte plötzlich nicht mehr, da der Inhaltstyp wie unten gezeigt nicht übereinstimmte
java.lang.AssertionError: Content type
Expected :application/json;charset=UTF-8
Actual :application/json
Ändern Sie den Code, .andExpect(content().contentType(MediaType.APPLICATION_JSON))
um das Problem vorerst zu beheben.
Beim Vergleich content
mit dem erwarteten serialisierten Objekt besteht jedoch immer noch eine Nichtübereinstimmung, wenn das Objekt Sonderzeichen enthält. Es scheint, dass die .getContentAsString()
Methode standardmäßig nicht mehr die UTF-8-Zeichencodierung verwendet (mehr).
java.lang.AssertionError: Response content expected:<[{"description":"Er hörte leise Schritte hinter sich."}]> but was:<[{"description":"Er hörte leise Schritte hinter sich."}]>
Expected :[{"description":"Er hörte leise Schritte hinter sich."}]
Actual :[{"description":"Er hörte leise Schritte hinter sich."}]
Wie komme ich content
zur UTF-8-Codierung?
Verwenden
.getContentAsString(StandardCharsets.UTF_8)
anstelle von.getContentAsString()
behebt das Problem.quelle
Das Standardcodierungszeichen ist seit der Version 5.2.0 von Spring nicht mehr UTF-8.
Um UTF-8 weiterhin verwenden zu können, müssen Sie es in der ServletResponse des MockMvc-Ergebnisses festlegen. Führen Sie in Ihrer Setup-Methode Folgendes aus, um die Standardzeichencodierung auf UTF-8 festzulegen:
Anschließend können Sie die mockMvc-Instanz verwenden, um Ihre Anforderung auszuführen.
Ich hoffe das hilft.
quelle
Gemäß dieser Pull-Anfrage der Federentwickler wird der UTF-8-Header nicht mehr benötigt und ist daher veraltet. Wenn Sie den UTF-8-Header in Ihrer Anwendung verwenden, können Sie ihn aus Ihrer Anwendung entfernen, anstatt zu versuchen, Ihren Test zu reparieren. Stellen Sie einfach sicher, dass Sie den Header Content-Type: application / json verwenden, und es sollte Ihnen gut gehen.
quelle
Ich verwende Spring Boot 1.5.15.RELEASE und habe beim Schreiben von Tests das gleiche Problem festgestellt.
Die erste Lösung, die mir geholfen hat, war das Hinzufügen von .characterEncoding ("UTF-8")) wie folgt:
Ich verwende einen StandaloneMockMvcBuilder in meiner Testklasse. Die zweite Lösung, die mir geholfen hat, war das Erstellen eines Filters, z.
und später zur StandaloneSetup-Methode in meiner Testklasse wie folgt hinzufügen:
quelle
Zusätzliche Einstellung zu MockMvc
.accept(MediaType.APPLICATION_JSON_UTF8_VALUE)
:Dieses Problem ist nicht Spring Boot, sondern MockMvc-spezifisch, denke ich. Daher muss eine Problemumgehung nur auf MockMvc angewendet werden. ( JSON muss mit UTF-8 codiert werden .)
Zugehöriges Problem: Unsachgemäße UTF-8-Behandlung in MockMvc für JSON-Antwort · Problem Nr. 23622 · Spring-Projekte / Spring-Framework
quelle