Saya memiliki tes integrasi sederhana
@Test
public void shouldReturnErrorMessageToAdminWhenCreatingUserWithUsedUserName() throws Exception {
mockMvc.perform(post("/api/users").header("Authorization", base64ForTestUser).contentType(MediaType.APPLICATION_JSON)
.content("{\"userName\":\"testUserDetails\",\"firstName\":\"xxx\",\"lastName\":\"xxx\",\"password\":\"xxx\"}"))
.andDo(print())
.andExpect(status().isBadRequest())
.andExpect(?);
}
Pada baris terakhir saya ingin membandingkan string yang diterima di tubuh respons dengan string yang diharapkan
Dan sebagai tanggapan saya mendapatkan:
MockHttpServletResponse:
Status = 400
Error message = null
Headers = {Content-Type=[application/json]}
Content type = application/json
Body = "Username already taken"
Forwarded URL = null
Redirected URL = null
Mencoba beberapa trik dengan konten (), tubuh () tetapi tidak ada yang berhasil.
java
spring
mocking
spring-test-mvc
pbaranski
sumber
sumber
"Username already taken"
. Itu seharusnya lebih dari 409 Konflik.Jawaban:
Anda dapat memanggil
andReturn()
dan menggunakanMvcResult
objek yang dikembalikan untuk mendapatkan konten sebagaiString
.Lihat di bawah:
sumber
@RestController
menunjukkan bahwa semua metode handler secara implisit dijelaskan dengan@ResponseBody
. Ini berarti bahwa Spring akan menggunakan aHttpMessageConverter
untuk membuat cerita bersambung dari nilai pengembalian pawang dan menuliskannya pada respons. Anda bisa mendapatkan tubuhcontent()
.getContentAsString()
yang datang dari@RestController
pengontrol -anotot saya .result.getResponse().getErrorMessage()
andReturn
mengembalikan aMvcResult
, sebagaimana ditentukan dalam javadoc di sini .@Sotirios Delimanolis menjawab melakukan pekerjaan tetapi saya mencari untuk membandingkan string dalam pernyataan mockMvc
Jadi begini
Tentu saja pernyataan saya gagal:
karena:
Jadi ini adalah bukti bahwa itu berhasil!
sumber
.andExpect(content().string(containsString("\"Username already taken");
org.hamcrest.Matchers.containsString()
.org.hamcrest.Matchers.equalToIgnoringWhiteSpace()
pencocokan untuk mengabaikan semua karakter spasi putih. Mungkin itu akan menjadi tip yang berguna bagi seseorangSpring MockMvc sekarang memiliki dukungan langsung untuk JSON. Jadi, Anda hanya mengatakan:
dan tidak seperti perbandingan string, ia akan mengatakan sesuatu seperti "field xyz hilang" atau "pesan Diharapkan 'ok' got 'nok'.
Metode ini diperkenalkan di Spring 4.1.
sumber
ContentRequestMatchers
mendukung fitur ini juga?Membaca jawaban ini, saya bisa melihat banyak yang berkaitan dengan Spring versi 4.x, saya menggunakan versi 3.2.0 karena berbagai alasan. Jadi hal-hal seperti dukungan json langsung dari
content()
tidak mungkin.Saya menemukan bahwa menggunakan
MockMvcResultMatchers.jsonPath
sangat mudah dan bekerja dengan baik. Berikut adalah contoh pengujian metode posting.Bonus dengan solusi ini adalah Anda masih cocok dengan atribut, tidak mengandalkan perbandingan string json penuh.
(Menggunakan
org.springframework.test.web.servlet.result.MockMvcResultMatchers
)Badan permintaan hanyalah string json, yang dapat Anda muat dengan mudah dari file data mock json asli jika Anda mau, tapi saya tidak memasukkannya di sini karena akan menyimpang dari pertanyaan.
Json yang sebenarnya kembali akan terlihat seperti ini:
sumber
Diambil dari tutorial musim semi
is
tersedia dariimport static org.hamcrest.Matchers.*;
jsonPath
tersedia dariimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
dan
jsonPath
referensi dapat ditemukan di sinisumber
error: incompatible types: RequestMatcher cannot be converted to ResultMatcher
untuk.andExpect(content().contentType(contentType))
@WithMockUser
Pencocokan spring security dan hamcrestcontainsString
membuat solusi sederhana dan elegan:Lebih banyak contoh di github
sumber
Berikut adalah contoh cara mem-parsing respons JSON dan bahkan cara mengirim permintaan dengan kacang dalam bentuk JSON:
Seperti yang Anda lihat di sini
Book
adalah permintaan DTO danUpdateBookResponse
objek respons diuraikan dari JSON. Anda mungkin ingin mengubahObjectMapper
konfigurasi Jakson .sumber
Ini akan memberi Anda tubuh respons. "Nama pengguna sudah diambil" dalam kasus Anda.
sumber
di sini cara yang lebih elegan
sumber
Anda dapat menggunakan metode 'getContentAsString' untuk mendapatkan data respons sebagai string.
Anda dapat merujuk tautan ini untuk aplikasi uji.
sumber
Salah satu pendekatan yang mungkin adalah dengan memasukkan
gson
ketergantungan:dan parsing nilai untuk membuat verifikasi Anda:
sumber