Saat ini saya sedang dalam proses menggunakan Mockito untuk mengolok-olok objek lapisan layanan saya dalam aplikasi Spring MVC di mana saya ingin menguji metode Pengontrol saya. Namun, karena saya telah membaca tentang spesifikasi Mockito, saya telah menemukan bahwa metode doReturn(...).when(...)
ini setara dengan when(...).thenReturn(...)
. Jadi, pertanyaan saya adalah apa gunanya memiliki dua metode yang melakukan hal yang sama atau apa perbedaan halus antara doReturn(...).when(...)
dan when(...).thenReturn(...)
?
Bantuan apa pun akan dihargai.
java
unit-testing
mockito
Macan kumbang
sumber
sumber
doReturn()
yang bermanfaat.Jawaban:
Dua sintaks untuk stubbing kira-kira sama. Namun, Anda selalu dapat menggunakan
doReturn/when
untuk stubbing; tetapi ada kasus di mana Anda tidak bisa menggunakanwhen/thenReturn
. Metode stubbing void adalah salah satunya. Lainnya termasuk digunakan dengan mata-mata Mockito, dan mematikan metode yang sama lebih dari sekali.Satu hal yang
when/thenReturn
memberi Anda, itudoReturn/when
tidak, adalah memeriksa jenis nilai yang Anda kembalikan, pada waktu kompilasi. Namun, saya percaya ini hampir tidak ada nilainya - jika Anda salah mengetik, Anda akan segera tahu setelah menjalankan tes.Saya sangat merekomendasikan hanya menggunakan
doReturn/when
. Tidak ada gunanya mempelajari dua sintaks ketika satu akan dilakukan.Anda mungkin ingin merujuk ke jawaban saya di "tata bahasa" Pembentukan Mockito - jawaban yang lebih rinci untuk pertanyaan yang sangat terkait.
sumber
doReturn/when
dan menghabiskan beberapa menit berikutnya mencari tahu apa yang salah. Pengecekan tipe tipe kompilasi menjadi sangat bergunawhen/thenReturn
.when/thenReturn
alih-alihdoReturn/when
.doReturn/when
adalah trade-off. Tim tidak merekomendasikan satu atau lain cara tetapi perhatikanwhen/then
pendekatannya lebih intuitif, lebih mudah dibaca dan menawarkan kompilasi waktu pemeriksaan, itu adalah pendekatan yang membuat Mockito populer dan mudah digunakan, jangan lupa bahwa ketika basis kode dibagi oleh berbagai keahlian dalam tim Anda; namun memiliki kelemahan terkait mata-mata dan metode batal.doReturn()
memiliki kelemahan besar untuk beralih ke pengkodean gaya panggilan metode YODA. Masalahnya kemudian ditulis terlebih dahulu yaitu. Kebanyakan orang membaca dari kiri ke kanan; jadi Anda sekarang harus selalu ingat untuk membalikkan logika return-when di kepala Anda.Kedua pendekatan berperilaku berbeda jika Anda menggunakan objek mata-mata (beranotasi dengan
@Spy
) daripada tiruan (beranotasi dengan@Mock
):when(...) thenReturn(...)
membuat panggilan metode nyata tepat sebelum nilai yang ditentukan akan dikembalikan. Jadi jika metode yang dipanggil melempar Exception Anda harus menghadapinya / mengejeknya dll. Tentu saja Anda masih mendapatkan hasil Anda (apa yang Anda definisikanthenReturn(...)
)doReturn(...) when(...)
tidak memanggil metode sama sekali .Contoh:
Uji:
sumber
doReturn()
, itu tampak seperti penyalahgunaan perpustakaan. Tujuan memata-matai bukannya mengejek murni adalah untuk mengambil keuntungan dari panggilan nyata. Mereka juga memperingatkan agar tidak menggunakan Spies seperti ini: github.com/mockito/mockito/wiki/Using-Spies-(and-Fakes) (dan merekomendasikan untuk memperluas kelas dan mengganti metode sebagai gantinya)Javadoc Mockito tampaknya memberi tahu mengapa menggunakan
doReturn()
alih-alihwhen()
Gunakan doReturn () pada kesempatan langka saat Anda tidak dapat menggunakan Mockito.when (Objek).sumber
Melanjutkan jawaban ini , Ada perbedaan lain bahwa jika Anda ingin metode Anda mengembalikan nilai yang berbeda misalnya saat pertama kali dipanggil, kedua kalinya dipanggil dll maka Anda dapat memberikan nilai jadi misalnya ...
Jadi itu akan mengembalikan false ketika metode ini dipanggil dalam test case yang sama dan kemudian itu akan kembali false lagi dan yang terakhir benar.
sumber
Alternatif terakhir digunakan untuk metode pada tiruan yang kembali
void
.Silakan lihat, misalnya, di sini: Cara membuat metode mock to void dengan mockito
sumber