Setelah saya memutakhirkan ke versi yang baru dirilis 2.2.0.RELEASE
Spring Boot beberapa tes saya gagal. Tampaknya MediaType.APPLICATION_JSON_UTF8
sudah usang dan tidak lagi dikembalikan sebagai tipe konten default dari metode pengontrol yang tidak menentukan tipe konten secara eksplisit.
Kode uji suka
String content = mockMvc.perform(get("/some-api")
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
.andReturn()
.getResponse()
.getContentAsString();
tiba-tiba tidak berfungsi lagi karena jenis konten tidak cocok seperti yang ditunjukkan di bawah ini
java.lang.AssertionError: Content type
Expected :application/json;charset=UTF-8
Actual :application/json
Mengubah kode untuk .andExpect(content().contentType(MediaType.APPLICATION_JSON))
menyelesaikan masalah untuk saat ini.
Tetapi sekarang ketika membandingkan content
dengan objek serial yang diharapkan masih ada ketidakcocokan jika ada karakter khusus dalam objek. Tampaknya .getContentAsString()
metode ini tidak menggunakan pengkodean karakter UTF-8 secara default (lagi).
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."}]
Bagaimana saya bisa masuk content
dalam pengkodean UTF-8?
Menggunakan
.getContentAsString(StandardCharsets.UTF_8)
alih-alih.getContentAsString()
menyelesaikan masalah.sumber
Karakter penyandian default tidak lagi UTF-8 sejak versi 5.2.0 dari pegas.
Untuk terus menggunakan UTF-8, Anda harus mengaturnya di ServletResponse dari hasil MockMvc. Untuk mengatur pengkodean karakter default ke UTF-8, lakukan sesuatu seperti ini dalam metode pengaturan Anda:
Kemudian Anda dapat menggunakan contoh mockMvc untuk melakukan permintaan Anda.
Semoga bantuan ini.
sumber
Menurut permintaan tarik ini dari pengembang musim semi header UTF-8 tidak diperlukan lagi dan karena itu sudah usang. Jika Anda menggunakan header UTF-8 di aplikasi Anda, Anda mungkin mempertimbangkan untuk menghapusnya dari aplikasi Anda alih-alih mencoba memperbaiki tes Anda. Pastikan Anda menggunakan header Content-Type: application / json dan Anda akan baik-baik saja.
sumber
Saya menggunakan Spring Boot 1.5.15.RELEASE dan menghadapi masalah yang sama saat menulis tes.
Solusi pertama yang membantu saya adalah menambahkan .characterEncoding ("UTF-8")) seperti ini:
Saya menggunakan StandaloneMockMvcBuilder di kelas pengujian saya, jadi solusi kedua yang membantu saya adalah membuat filter misalnya:
dan kemudian menambahkannya ke metode standaloneSetup di kelas pengujian saya seperti ini:
sumber
Pengaturan tambahan untuk MockMvc,
.accept(MediaType.APPLICATION_JSON_UTF8_VALUE)
:Masalah ini bukan Spring Boot, tapi MockMvc yang spesifik, kurasa. Jadi, solusi harus diterapkan ke MockMvc saja. ( JSON harus dikodekan menggunakan UTF-8 .)
masalah terkait: Penanganan UTF-8 yang tidak benar di MockMvc untuk respons JSON · Edisi # 23622 · pegas-proyek / pegas-kerangka kerja
sumber