После обновления до недавно выпущенной 2.2.0.RELEASE
версии Spring Boot некоторые мои тесты не прошли. Похоже, что MediaType.APPLICATION_JSON_UTF8
он устарел и больше не возвращается как тип контента по умолчанию из методов контроллера, которые не указывают тип контента явно.
Тестовый код как
String content = mockMvc.perform(get("/some-api")
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
.andReturn()
.getResponse()
.getContentAsString();
внезапно больше не работает, так как тип контента не соответствует, как показано ниже
java.lang.AssertionError: Content type
Expected :application/json;charset=UTF-8
Actual :application/json
Изменение кода для .andExpect(content().contentType(MediaType.APPLICATION_JSON))
решения проблемы на данный момент.
Но теперь при сравнении content
с ожидаемым сериализованным объектом все еще существует несоответствие, если в объекте есть какие-либо специальные символы. Похоже, что .getContentAsString()
метод по умолчанию не использует кодировку UTF-8 (больше).
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."}]
Как я могу получить content
в кодировке UTF-8?
Использование
.getContentAsString(StandardCharsets.UTF_8)
вместо.getContentAsString()
решает проблему.источник
Кодировка по умолчанию больше не является UTF-8, начиная с версии 5.2.0 spring.
Чтобы продолжить использование UTF-8, вы должны установить его в ServletResponse результата MockMvc. Чтобы установить кодировку символов по умолчанию UTF-8, сделайте что-то подобное в вашем методе настройки:
Затем вы можете использовать экземпляр mockMvc для выполнения вашего запроса.
Надеюсь, это поможет.
источник
Согласно этому запросу от разработчиков пружин, заголовок UTF-8 больше не требуется, и поэтому он устарел. Если вы используете заголовок UTF-8 в своем приложении, вы можете рассмотреть возможность его удаления из приложения вместо того, чтобы пытаться исправить свой тест. Просто убедитесь, что вы используете заголовок Content-Type: application / json, и все будет в порядке.
источник
Я использую Spring Boot 1.5.15.RELEASE и столкнулся с той же проблемой при написании тестов.
Первым решением, которое мне помогло, было добавить .characterEncoding ("UTF-8")) следующим образом:
Я использую StandaloneMockMvcBuilder в своем тестовом классе, поэтому вторым решением, которое мне помогло, было создание фильтра, например:
и позже добавьте его в метод standaloneSetup в моем тестовом классе следующим образом:
источник
Дополнительные настройки для MockMvc
.accept(MediaType.APPLICATION_JSON_UTF8_VALUE)
:Эта проблема не Spring Boot, а, скорее всего, специфическая для MockMvc. Таким образом, обходной путь должен применяться только к MockMvc. ( JSON должен быть закодирован с использованием UTF-8 .)
связанная с этим проблема: неправильная обработка UTF-8 в MockMvc для ответа JSON · проблема № 23622 · spring-projects / spring-framework
источник