Po aktualizacji do nowo wydanej 2.2.0.RELEASE
wersji Spring Boot niektóre z moich testów zakończyły się niepowodzeniem. Wygląda na to, że MediaType.APPLICATION_JSON_UTF8
został on uznany za przestarzały i nie jest już zwracany jako domyślny typ zawartości z metod kontrolera, które nie określają jawnie typu zawartości.
Kod testowy jak
String content = mockMvc.perform(get("/some-api")
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
.andReturn()
.getResponse()
.getContentAsString();
nagle przestał działać, ponieważ typ zawartości był niezgodny, jak pokazano poniżej
java.lang.AssertionError: Content type
Expected :application/json;charset=UTF-8
Actual :application/json
Na razie zmieniam kod, aby .andExpect(content().contentType(MediaType.APPLICATION_JSON))
rozwiązać problem.
Ale teraz w porównaniu content
z oczekiwanym serializowanym obiektem nadal występuje niedopasowanie, jeśli w obiekcie znajdują się jakieś znaki specjalne. Wygląda na to, że .getContentAsString()
metoda nie wykorzystuje domyślnie kodowania znaków UTF-8 (więcej).
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."}]
Jak mogę uzyskać content
kodowanie UTF-8?
Używanie
.getContentAsString(StandardCharsets.UTF_8)
zamiast.getContentAsString()
rozwiązywać problem.źródło
Domyślny znak kodowania nie jest już UTF-8 od wersji wiosennej 5.2.0.
Aby kontynuować korzystanie z UTF-8, musisz ustawić go w odpowiedzi ServletRock wyniku MockMvc. Aby ustawić domyślne kodowanie znaków na UTF-8, wykonaj coś takiego w metodzie konfiguracji:
Następnie możesz użyć instancji mockMvc, aby wykonać żądanie.
Mam nadzieję, że to pomoże.
źródło
Zgodnie z tym żądaniem ściągania od deweloperów wiosennych nagłówek UTF-8 nie jest już wymagany i dlatego jest przestarzały. Jeśli używasz nagłówka UTF-8 w swojej aplikacji, możesz spróbować usunąć go z aplikacji zamiast próbować naprawić test. Upewnij się tylko, że używasz nagłówka Content-Type: application / json i wszystko powinno być w porządku.
źródło
Używam Spring Boot 1.5.15. RELEASE i napotkałem ten sam problem podczas pisania testów.
Pierwszym rozwiązaniem, które pomogło mi, było dodanie .characterEncoding („UTF-8”)) w następujący sposób:
Używam StandaloneMockMvcBuilder w mojej klasie testowej, więc drugim rozwiązaniem, które pomogło mi, było utworzenie filtra, np .:
a później dodaj go do metody standaloneSetup w mojej klasie testowej w następujący sposób:
źródło
Dodatkowe ustawienie MockMvc
.accept(MediaType.APPLICATION_JSON_UTF8_VALUE)
:Ten problem nie dotyczy Spring Boot, ale chyba konkretny MockMvc. Tak więc obejście musi być zastosowane tylko do MockMvc. ( JSON musi być zakodowany przy użyciu UTF-8 .)
powiązany problem: niewłaściwa obsługa UTF-8 w MockMvc dla odpowiedzi JSON · Problem # 23622 · wiosenne projekty / wiosenne ramy
źródło