Saya mencoba menguji beberapa kode lama, menggunakan Mockito.
Saya ingin rintisan FooDao
yang digunakan dalam produksi sebagai berikut:
foo = fooDao.getBar(new Bazoo());
Saya bisa menulis:
when(fooDao.getBar(new Bazoo())).thenReturn(myFoo);
Tetapi masalah yang jelas adalah bahwa getBar()
tidak pernah dipanggil dengan Bazoo
objek yang sama yang saya matikan metode untuk. (Kutukan new
operator itu!)
Saya akan senang jika saya bisa mematikan metode dengan cara yang mengembalikan myFoo
tanpa argumen. Gagal itu, saya akan mendengarkan saran solusi lainnya, tapi saya benar-benar ingin menghindari mengubah kode produksi sampai ada cakupan pengujian yang masuk akal.
java
unit-testing
mocking
mockito
Eric Wilson
sumber
sumber
notNull(Bazoo.class)
sepertiany(Bazoo.class)
(mungkin tidak ada pada saat jawaban ini)Bazoo
atauCazoo
yang keduanya merupakan subkelas dari, katakanlahAzoo
,. untukBazoo
saya perlu kembalifoo
, tetapi untukCazoo
saya perlu kembalibar
. dalam situasi iniMatchers.any()
solusi yang diusulkan tidak berhasil, namunMatchers.isA()
bekerja dengan sempurna.org.mockito.Matchers
sekarang sudah ditinggalkan -org.mockito.ArgumentMatchers
sebagai gantinya, yaituimport static org.mockito.ArgumentMatchers.*
(lihat dokumen )when(myFoo.knowsWhatsUp()).thenReturn(myMoney);
Gunakan seperti ini:
Sebelum Anda perlu mengimpor
Mockito.Matchers
sumber
http://site.mockito.org/mockito/docs/1.10.19/org/mockito/Matchers.html
anyObject()
harus sesuai dengan kebutuhan Anda.Juga, Anda selalu dapat mempertimbangkan implementasi
hashCode()
danequals()
untukBazoo
kelas. Ini akan membuat contoh kode Anda bekerja seperti yang Anda inginkan.sumber
Pilihan lain adalah mengandalkan
equals
metode mode lama yang bagus . Selama argumen dalamwhen
mockequals
argumen dalam kode yang diuji, maka Mockito akan cocok dengan mock.Berikut ini sebuah contoh.
kemudian, dengan anggapan Anda tahu berapa nilainya
someField
, Anda dapat mengejeknya seperti ini.pro: Ini lebih eksplisit daripada
any
pencocokan. Sebagai peninjau kode, saya tetap membuka mataany
dalam kode yang ditulis pengembang junior, karena melirik logika kode mereka untuk menghasilkan objek yang sesuai yang dilewatkan.con: Terkadang bidang yang diteruskan ke objek adalah ID acak. Untuk kasus ini, Anda tidak dapat dengan mudah membuat objek argumen yang diharapkan dalam kode tiruan Anda.
Pendekatan lain yang mungkin adalah dengan menggunakan objek Mockito
Answer
yang dapat digunakan denganwhen
metode ini.Answer
memungkinkan Anda mencegat panggilan aktual dan memeriksa argumen input dan mengembalikan objek tiruan. Dalam contoh di bawah ini saya menggunakanany
untuk menangkap permintaan apa pun untuk metode yang diejek. Tapi kemudian diAnswer
lambda, saya dapat memeriksa argumen Bazo lebih lanjut ... mungkin untuk memverifikasi bahwa ID yang tepat diberikan padanya. Saya lebih suka ini daripadaany
dengan sendirinya sehingga setidaknya beberapa inspeksi dilakukan pada argumen.Jadi untuk meringkas semuanya, saya suka mengandalkan
equals
(di mana argumen yang diharapkan dan argumen yang sebenarnya harus sama satu sama lain) dan jika persamaan tidak mungkin (karena tidak dapat memprediksi keadaan argumen yang sebenarnya), saya akan menggunakan untukAnswer
memeriksa argumen.sumber