Después de actualizar a la 2.2.0.RELEASE
versión recién lanzada de Spring Boot, algunas de mis pruebas fallaron. Parece que MediaType.APPLICATION_JSON_UTF8
ha quedado en desuso y ya no se devuelve como tipo de contenido predeterminado de los métodos del controlador que no especifican explícitamente el tipo de contenido.
Código de prueba como
String content = mockMvc.perform(get("/some-api")
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
.andReturn()
.getResponse()
.getContentAsString();
de repente ya no funcionó ya que el tipo de contenido no coincidía como se muestra a continuación
java.lang.AssertionError: Content type
Expected :application/json;charset=UTF-8
Actual :application/json
Cambiando el código para .andExpect(content().contentType(MediaType.APPLICATION_JSON))
resolver el problema por ahora.
Pero ahora, cuando se compara content
con el objeto serializado esperado, todavía hay una falta de coincidencia si hay caracteres especiales en el objeto. Parece que el .getContentAsString()
método no utiliza la codificación de caracteres UTF-8 de forma predeterminada (más).
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."}]
¿Cómo puedo obtener la content
codificación UTF-8?
Usar en
.getContentAsString(StandardCharsets.UTF_8)
lugar de.getContentAsString()
resuelve el problema.fuente
El carácter de codificación predeterminado ya no es UTF-8 desde la versión 5.2.0 de spring.
Para continuar usando UTF-8, debe configurarlo en ServletResponse del resultado de MockMvc. Para establecer la codificación de caracteres predeterminada en UTF-8, haga algo como esto en su método de configuración:
Luego puede usar la instancia de mockMvc para realizar su solicitud.
Espero que esto ayude.
fuente
De acuerdo con esta solicitud de extracción de los desarrolladores de Spring, el encabezado UTF-8 ya no es necesario y, por lo tanto, está en desuso. Si está utilizando el encabezado UTF-8 en su aplicación, puede considerar eliminarlo de su aplicación en lugar de intentar arreglar su prueba. Solo asegúrate de estar usando el tipo de contenido: encabezado de aplicación / json y estarás bien.
fuente
Estoy usando Spring Boot 1.5.15.RELEASE y enfrenté el mismo problema al escribir pruebas.
La primera solución que me ayudó fue agregar .characterEncoding ("UTF-8")) así:
Estoy usando un StandaloneMockMvcBuilder en mi clase de prueba, por lo que la segunda solución que me ayudó fue crear un filtro, por ejemplo:
y luego lo agrego al método standaloneSetup en mi clase de prueba de esta manera:
fuente
Ajuste adicional a MockMvc,
.accept(MediaType.APPLICATION_JSON_UTF8_VALUE)
:Este problema no es Spring Boot, sino uno específico de MockMvc, supongo. Por lo tanto, una solución debe aplicarse solo a MockMvc. ( JSON debe estar codificado con UTF-8 ).
problema relacionado: manejo UTF-8 incorrecto en MockMvc para respuesta JSON · Problema # 23622 · spring-projects / spring-framework
fuente