Après avoir mis à niveau vers la nouvelle 2.2.0.RELEASE
version de Spring Boot, certains de mes tests ont échoué. Il semble que le MediaType.APPLICATION_JSON_UTF8
soit obsolète et qu'il ne soit plus renvoyé comme type de contenu par défaut à partir des méthodes de contrôleur qui ne spécifient pas le type de contenu explicitement.
Code de test comme
String content = mockMvc.perform(get("/some-api")
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
.andReturn()
.getResponse()
.getContentAsString();
n'a soudainement plus fonctionné car le type de contenu n'était pas compatible, comme illustré ci-dessous
java.lang.AssertionError: Content type
Expected :application/json;charset=UTF-8
Actual :application/json
Changer le code pour .andExpect(content().contentType(MediaType.APPLICATION_JSON))
résoudre le problème pour l'instant.
Mais maintenant, lors de la comparaison content
avec l'objet sérialisé attendu, il y a toujours un décalage s'il y a des caractères spéciaux dans l'objet. Il semble que la .getContentAsString()
méthode n'utilise pas le codage de caractères UTF-8 par défaut (plus).
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."}]
Comment puis-je obtenir content
en encodage UTF-8?
Utiliser
.getContentAsString(StandardCharsets.UTF_8)
au lieu de.getContentAsString()
résout le problème.la source
Le caractère d'encodage par défaut n'est plus UTF-8 depuis la version 5.2.0 de spring.
Pour continuer à utiliser UTF-8, vous devez le définir dans la ServletResponse du résultat MockMvc. Pour définir le codage de caractères par défaut sur UTF-8, faites quelque chose comme ceci dans votre méthode de configuration:
Ensuite, vous pouvez utiliser l'instance mockMvc pour effectuer votre demande.
J'espère que cette aide.
la source
Selon cette demande de traction des développeurs de printemps, l'en-tête UTF-8 n'est plus nécessaire et est donc obsolète. Si vous utilisez l'en-tête UTF-8 dans votre application, vous pouvez envisager de le supprimer de votre application au lieu d'essayer de corriger votre test. Assurez-vous simplement que vous utilisez l'en - tête Content-Type: application / json et tout devrait bien se passer.
la source
J'utilise Spring Boot 1.5.15.RELEASE et j'ai rencontré le même problème lors de l'écriture de tests.
La première solution qui m'a aidé a été d'ajouter .characterEncoding ("UTF-8")) comme ceci:
J'utilise un StandaloneMockMvcBuilder dans ma classe de test, donc la deuxième solution qui m'a aidé était de créer un filtre, par exemple:
et l'ajouter plus tard à la méthode standaloneSetup dans ma classe de test comme ceci:
la source
Paramètre supplémentaire à MockMvc,
.accept(MediaType.APPLICATION_JSON_UTF8_VALUE)
:Ce problème n'est pas Spring Boot, mais spécifique à MockMvc, je suppose. Par conséquent, une solution de contournement doit être appliquée à MockMvc uniquement. ( JSON doit être codé en UTF-8 .)
problème lié: Mauvaise gestion UTF-8 dans MockMvc pour la réponse JSON · Numéro # 23622 · spring-projects / spring-framework
la source