Apa cara terbaik untuk memalsukan server untuk pengujian saat menggunakan kerangka retrofit persegi .
Cara potensial:
Buat klien retrofit baru dan setel di RestAdapter.Builder (). SetClient (). Ini melibatkan penguraian objek Request dan mengembalikan json sebagai objek Respon.
Implementasikan antarmuka beranotasi ini sebagai kelas tiruan dan gunakan itu sebagai pengganti versi yang disediakan oleh RestAdapter.create () (tidak akan menguji serialisasi gson)
?
Idealnya saya ingin server tiruan memberikan tanggapan json sehingga saya dapat menguji serialisasi gson pada saat yang bersamaan.
Setiap contoh akan sangat dihargai.
square-oss
? Tampaknya diberikan berlebihanretrofit
.Jawaban:
Permintaan Mock Retrofit 2.0 untuk Pengujian
Karena mekanisme lama seperti membuat
MockClient
kelas dan mengimplementasikannyaClient
tidak berfungsi lagi dengan Retrofit 2.0, di sini saya menjelaskan cara baru untuk melakukan itu. Semua yang perlu Anda lakukan sekarang adalah menambahkan interseptor kustom Anda untuk OkHttpClient seperti yang ditunjukkan di bawah ini .FakeInterceptor
class hanya menggantiintercept
metode dan dalam kasus jika aplikasi dalamDEBUG
mode kembali diberikan JSON.RestClient.java
IRestService.java
FakeInterceptor.java
Kode sumber proyek di GitHub
sumber
uri()
kekuranganchain.request().uri()
(saya memperbaikinyaString url = chain.request().url().toString();
karena kasus saya berbeda). 2- Saya mendapatkanjava.lang.IllegalStateException: network interceptor my.package.name.FakeInterceptor must call proceed() exactly once
. Saya telah menambahkan ini keaddNetworkInterceptor()
daripadaaddInterceptor()
.Saya memutuskan untuk mencoba metode 1 sebagai berikut
Dan menggunakannya dengan:
Ini berfungsi dengan baik dan memungkinkan Anda untuk menguji string json Anda tanpa harus menghubungi server sebenarnya!
sumber
IllegalArgumentException url == null
menggunakan Retrofit 1.4.1.builder.setEndpoint("http://mockserver.com").setClient(new MockClient());
Menguji deserialisasi JSON ke objek Anda (mungkin dengan
TypeAdapters
?) Tampaknya seperti masalah terpisah yang memerlukan pengujian unit terpisah.Saya menggunakan versi 2 secara pribadi. Ini memberikan kode yang aman untuk tipe, ramah refactor yang dapat dengan mudah di-debug dan diubah. Lagi pula, apa gunanya mendeklarasikan API Anda sebagai antarmuka jika Anda tidak membuat versi alternatif untuk pengujian! Polimorfisme untuk kemenangan.
Pilihan lainnya adalah menggunakan Java
Proxy
. Ini sebenarnya bagaimana Retrofit (saat ini) mengimplementasikan interaksi HTTP yang mendasarinya. Ini memang membutuhkan lebih banyak pekerjaan, tetapi akan memungkinkan tiruan yang jauh lebih dinamis.sumber
Anda juga dapat menggunakan sesuatu seperti Webservermock dari Squareup! -> https://github.com/square/okhttp/tree/master/mockwebserver
sumber
Saya adalah penggemar berat Apiary.io karena mengejek API sebelum pindah ke server sebenarnya.
Anda juga dapat menggunakan file .json datar dan membacanya dari sistem file.
Anda juga dapat menggunakan API yang dapat diakses publik seperti Twitter, Flickr, dll.
Berikut adalah beberapa sumber bagus lainnya tentang Retrofit.
Slide: https://docs.google.com/presentation/d/12Eb8OPI0PDisCjWne9-0qlXvp_-R4HmqVCjigOIgwfY/edit#slide=id.p
Video: http://www.youtube.com/watch?v=UtM06W51pPw&feature=g-user-u
Contoh Proyek: https://github.com/dustin-graham/ucad_twitter_retrofit_sample
sumber
Ejekan (penafian: Akulah penulisnya) dirancang hanya untuk tugas ini.
Mockery adalah pustaka tiruan / pengujian yang berfokus pada memvalidasi lapisan jaringan dengan dukungan bawaan untuk Retrofit. Ini menghasilkan pengujian JUnit secara otomatis berdasarkan spesifikasi Api yang diberikan. Idenya adalah untuk tidak menulis tes apapun secara manual; tidak mengimplementasikan antarmuka untuk meniru respons server.
sumber
Pertama, buat antarmuka Retrofit Anda.
Pemohon Anda mengikuti:
Jika Anda menggunakan pilihan kedua (gunakan antarmuka Retrofit ke data server Mock), Anda perlu MockRetrofit, gunakan kode berikut:
4. Data saya berasal dari file aset (Asset / server / EventList.json), konten file ini adalah:
5. Jika Anda menggunakan interseptor okhttp3, Anda perlu interseptor yang ditentukan sendiri, seperti ini:
6. Terakhir, Anda dapat meminta server Anda dengan kode:
Terima kasih sudah membaca.
sumber
Menambah jawaban oleh @Alec, saya telah memperluas klien tiruan untuk mendapatkan respons langsung dari file teks di folder aset tergantung pada URL permintaan.
Ex
Di sini klien tiruan, memahami bahwa URL yang diaktifkan diaktifkan dan mencari file bernama activ.txt di folder aset. Itu membaca konten dari file assets / activ.txt dan mengirimkannya sebagai respons untuk API.
Ini diperpanjang
MockClient
Untuk penjelasan rinci, Anda dapat memeriksa blog saya
http://www.cumulations.com/blogs/13/Mock-API-response-in-Retrofit-using-custom-clients
sumber
MockClient
file saya , menulis kelas uji menggunakan robolectric. Tetapi saya tidak bisa mendapatkan tanggapan apa pun dari file json.JSONPlaceholder: REST API Online Palsu untuk Pengujian dan Pembuatan Prototipe
https://jsonplaceholder.typicode.com/
ReqresIn: REST API Online Lainnya
https://reqres.in/
Server tiruan tukang pos
Jika Anda ingin menguji muatan respons yang disesuaikan, dua di atas mungkin tidak sesuai dengan kebutuhan Anda, maka Anda dapat mencoba server tiruan tukang pos. Cukup mudah disiapkan dan fleksibel untuk menentukan permintaan Anda sendiri dan muatan respons.
https://learning.getpostman.com/docs/postman/mock_servers/intro_to_mock_servers/ https://youtu.be/shYn3Ys3ygE
sumber
Mocking api panggilan dengan Retrofit sekarang lebih mudah dengan Mockinizer yang membuat bekerja dengan MockWebServer sangat mudah:
Cukup buat peta RequestFilter dan MockResponses dan kemudian hubungkan ke rantai pembuat OkHttpClient Anda:
Anda tidak perlu khawatir tentang mengkonfigurasi MockWebServer dll. Cukup tambahkan ejekan Anda, sisanya dilakukan oleh Mockinizer untuk Anda.
(Penafian: Saya adalah penulis Mockinizer)
sumber
Bagi saya, Klien Retrofit khusus sangat bagus karena fleksibilitas. Terutama ketika Anda menggunakan kerangka DI apa pun, Anda dapat mengaktifkan / menonaktifkan tiruan dengan cepat dan sederhana. Saya menggunakan Klien khusus yang disediakan oleh Dagger juga dalam pengujian unit dan integrasi.
Sunting: Di sini Anda menemukan contoh mengejek retrofit https://github.com/pawelByszewski/retrofitmock
sumber