Mijoz tomonidagi kodni test qilish uchun RestTemplate bilan testlar ishlatish mumkin. G'oya shundaki, kutilayotgan so'rovlarni e'lon qilish va "stub javoblarini" berish, shunda kodni izolyatsiyalangan muhitda (serverning o'zi ishlamay turib) test qilish mumkin. Quyidagi misolda shuni qanday amalga oshirish ko'rsatilgan:
RestTemplate restTemplate = new RestTemplate();
MockRestServiceServer mockServer = MockRestServiceServer.bindTo(restTemplate).build();
mockServer.expect(requestTo("/greeting")).andRespond(withSuccess());
// Yuqoridagi RestTemplate dan foydalanadigan test kodi ...
mockServer.verify();
val restTemplate = RestTemplate()
val mockServer = MockRestServiceServer.bindTo(restTemplate).build()
mockServer.expect(requestTo("/greeting")).andRespond(withSuccess())
// Yuqoridagi RestTemplate dan foydalanadigan test kodi ...
mockServer.verify()
Yuqoridagi misolda MockRestServiceServer (mijoz tomonidagi REST testlari uchun asosiy sinf) RestTemplateni maxsus ClientHttpRequestFactory yordamida sozlaydi, bu haqiqiy so'rovlarning kutilgan hodisalarga mos kelishini tasdiqlaydi va "stub javoblarini" qaytaradi. Bu holda biz /greeting so'rovini kutamiz va 200 javobini text/plain mazmuni bilan qaytarmoqchimiz. Agar kerak bo'lsa, qo'shimcha kutilayotgan so'rovlar va stub javoblar belgilanishi mumkin. Agar biz kutilayotgan so'rovlar va stub javoblarini aniqlasak, RestTemplate mijoz kodida odatdagidek ishlatilishi mumkin. Test oxirida mockServer.verify() dan foydalanib, barcha kutilayotgan hodisalar sodir bo'lganligini tekshiramiz.
Dastlab so'rovlar kutilayotgan hodisalar e'lon qilingan tartibda kutiladi. ignoreExpectOrder opsiyasini serverni yaratishda o'rnatish mumkin, va bu holda barcha kutilayotgan hodisalar (tartibda) tekshiriladi, belgilangan so'rov uchun mos keladiganini topish uchun. Bu esa so'rovlarning istalgan tartibda kelishi mumkinligini anglatadi. Quyidagi misolda ignoreExpectOrder ishlatiladi:
server = MockRestServiceServer.bindTo(restTemplate).ignoreExpectOrder(true).build();
server = MockRestServiceServer.bindTo(restTemplate).ignoreExpectOrder(true).build()
Hatto tartibsiz so'rovlar holatida ham, default bo'yicha har bir so'rov faqat bir marta bajarilishi mumkin. expect metodi ExpectedCount argumentini qabul qiladigan variantni taqdim etadi, bu hisob diapazonini belgilaydi (masalan, once, manyTimes, max, min, between va hokazo). Quyidagi misolda times diapazoni ishlatiladi:
RestTemplate restTemplate = new RestTemplate();
MockRestServiceServer mockServer = MockRestServiceServer.bindTo(restTemplate).build();
mockServer.expect(times(2), requestTo("/something")).andRespond(withSuccess());
mockServer.expect(times(3), requestTo("/somewhere")).andRespond(withSuccess());
// ...
mockServer.verify();
val restTemplate = RestTemplate()
val mockServer = MockRestServiceServer.bindTo(restTemplate).build()
mockServer.expect(times(2), requestTo("/something")).andRespond(withSuccess())
mockServer.expect(times(3), requestTo("/somewhere")).andRespond(withSuccess())
// ...
mockServer.verify()
Esda tuting, agar ignoreExpectOrder o'rnatilmagan bo'lsa (default bo'yicha), va shuning uchun so'rovlar e'lon qilingan tartibda kutiladi, bu tartib faqat birinchi kutilayotgan so'rovga nisbatan qo'llaniladi. Masalan, agar "/something" ikki marta kutilsa va keyin "/somewhere" uch marta kutilsa, "/something" ning so'rovi "/somewhere" ga qadar kelishi kerak, lekin qolgan "/something" va "/somewhere" so'rovlari istalgan vaqtda kelishi mumkin.
Yuqoridagi barcha narsalarga alternativ sifatida, mijoz tomonida test qo'llab-quvvatlov funksiyasi MockMvc misoliga bog'lash uchun ClientHttpRequestFactory ning realizatsiyasini ham taqdim etadi, bu RestTemplate da sozlanishi mumkin. Bu serverni ishga tushirmasdan haqiqiy server tomonidagi mantiqlarni ishlatib so'rovlarni qayta ishlash imkonini beradi. Quyidagi misolda shuni qanday amalga oshirish ko'rsatilgan:
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
this.restTemplate = new RestTemplate(new MockMvcClientHttpRequestFactory(mockMvc));
// Yuqoridagi RestTemplate dan foydalanadigan test kodi ...
val mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build()
restTemplate = RestTemplate(MockMvcClientHttpRequestFactory(mockMvc))
// Yuqoridagi RestTemplate dan foydalanadigan test kodi ...
Statis import qilish
Server tomonidagi testlar kabi, mijoz tomonidagi testlar uchun ham oqimli API interfeysi ba'zi statik elementlarni import qilishni talab qiladi. Ularni MockRest* bo'yicha qidirish orqali osongina topish mumkin. Eclipse foydalanuvchilari MockRestRequestMatchers.* va MockRestResponseCreators.* ni "mahsus statik a'zolar" sifatida Eclipse sozlamalarida Java → Editor → Content Assist → Favorites bo'limida qo'shishlari kerak. Bu birinchi statik metod nomining belgisini kiritganingizdan so'ng avtomatik to'ldirish (content assist) ishlatishga imkon beradi. Boshqa IDElar (masalan, IntelliJ) qo'shimcha sozlashni talab qilmasligi mumkin. Statik a'zolar uchun kodni avtomatik to'ldirishni qo'llab-quvvatlashni tekshiring.
Mijoz tomonidagi REST testlarining boshqa misollari
Spring MVC Test o'z testlarida mijoz tomonidagi REST testlari misollarini o'z ichiga oladi.
GO TO FULL VERSION