Depois de atualizar para a 2.2.0.RELEASE
versão recém-lançada do Spring Boot, alguns dos meus testes falharam. Parece que MediaType.APPLICATION_JSON_UTF8
foi preterido e não é mais retornado como tipo de conteúdo padrão dos métodos do controlador que não especificam o tipo de conteúdo explicitamente.
Código de teste 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 não funcionou mais, pois o tipo de conteúdo era incompatível, como mostrado abaixo
java.lang.AssertionError: Content type
Expected :application/json;charset=UTF-8
Actual :application/json
Alterando o código para .andExpect(content().contentType(MediaType.APPLICATION_JSON))
o problema resolvido por enquanto.
Mas agora, ao comparar content
com o objeto serializado esperado, ainda há uma incompatibilidade se houver algum caractere especial no objeto. Parece que o .getContentAsString()
método não utiliza a codificação de caracteres UTF-8 por padrão (mais nada).
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."}]
Como posso obter a content
codificação UTF-8?
Usar em
.getContentAsString(StandardCharsets.UTF_8)
vez de.getContentAsString()
resolve o problema.fonte
O caractere de codificação padrão não é mais UTF-8 desde a versão 5.2.0 do spring.
Para continuar usando o UTF-8, você deve configurá-lo no ServletResponse do resultado do MockMvc. Para definir a codificação de caracteres padrão como UTF-8, faça algo assim no seu método de configuração:
Em seguida, você pode usar a instância mockMvc para executar sua solicitação.
Espero que esta ajuda.
fonte
De acordo com essa solicitação de recebimento dos desenvolvedores da primavera, o cabeçalho UTF-8 não é mais necessário e, portanto, está obsoleto. Se você estiver usando o cabeçalho UTF-8 em seu aplicativo, considere removê-lo do seu aplicativo em vez de tentar corrigir seu teste. Apenas certifique-se de usar o cabeçalho application-json / Content-Type: e você deve estar bem.
fonte
Estou usando o Spring Boot 1.5.15.RELEASE e enfrentou o mesmo problema ao escrever testes.
A primeira solução que me ajudou foi adicionar .characterEncoding ("UTF-8")) assim:
Estou usando um StandaloneMockMvcBuilder na minha classe de teste, então a segunda solução que me ajudou foi a criação de um filtro, por exemplo:
e depois adicione-o ao método standaloneSetup na minha classe de teste, assim:
fonte
Configuração adicional para MockMvc
.accept(MediaType.APPLICATION_JSON_UTF8_VALUE)
:Esse problema não é o Spring Boot, mas sim o MockMvc, eu acho. Portanto, uma solução alternativa deve ser aplicada apenas ao MockMvc. ( JSON deve ser codificado usando UTF-8 .)
problema relacionado: Manuseio inadequado de UTF-8 no MockMvc para resposta JSON · Edição nº 23622 · spring-projects / spring-framework
fonte