Dalam dokumentasi dan javadocs Mockito dikatakan
Dianjurkan untuk menggunakan ArgumentCaptor dengan verifikasi tetapi tidak dengan stubbing.
tapi saya tidak mengerti bagaimana ArgumentCaptor dapat digunakan untuk stubbing. Dapatkah seseorang menjelaskan pernyataan di atas dan menunjukkan bagaimana ArgumentCaptor dapat digunakan untuk mematikan tulisan atau memberikan tautan yang menunjukkan bagaimana hal itu dapat dilakukan?
java
unit-testing
junit
mockito
Tidak tahu
sumber
sumber
Jawaban:
Dengan asumsi metode berikut untuk menguji:
Dokumentasi Mockito mengatakan bahwa Anda tidak boleh menggunakan penculik dengan cara ini:
Karena Anda bisa menggunakan korek api saat mematikan:
Tetapi verifikasi adalah cerita yang berbeda. Jika pengujian Anda perlu memastikan bahwa metode ini dipanggil dengan argumen khusus, gunakan
ArgumentCaptor
dan inilah kasus yang dirancangnya:sumber
false
, bukantrue
.Garis
akan melakukan hal yang sama seperti
Jadi, menggunakan argumentCaptor.capture () ketika stubbing tidak memiliki nilai tambah. Menggunakan Matchers.any () menunjukkan lebih baik apa yang sebenarnya terjadi dan karenanya lebih baik untuk dibaca. Dengan argumentCaptor.capture (), Anda tidak dapat membaca argumen apa yang benar-benar cocok. Dan alih-alih menggunakan sembarang (), Anda dapat menggunakan pencocokan yang lebih spesifik ketika Anda memiliki lebih banyak informasi (kelas dari argumen yang diharapkan), untuk meningkatkan pengujian Anda.
Dan masalah lain: Jika menggunakan argumentCaptor.capture () saat mematikan itu menjadi tidak jelas berapa banyak nilai yang Anda harapkan akan ditangkap setelah verifikasi. Kami ingin mengambil nilai selama verifikasi, bukan saat mematikan karena pada saat itu belum ada nilai untuk ditangkap. Jadi, apa yang ditangkap oleh metode yang ditangkap oleh para penculik selama stubbing? atau tidakkah ia menangkap sesuatu? Saya tidak punya jawaban untuk pertanyaan ini. Saya menganggapnya sebagai perilaku yang tidak terdefinisi dan saya tidak ingin menggunakan perilaku yang tidak terdefinisi.
sumber
Hipotetis, jika pencarian mendarat Anda pada pertanyaan ini maka Anda mungkin menginginkan ini:
Mengapa? Karena seperti saya, Anda menghargai waktu dan Anda tidak akan mengimplementasikannya
.equals
hanya demi skenario uji tunggal.Dan 99% tes berantakan dengan null dikembalikan dari Mock dan dalam desain yang masuk akal Anda akan menghindari pengembalian
null
di semua biaya, menggunakanOptional
atau pindah ke Kotlin. Ini menyiratkan bahwaverify
tidak perlu sering digunakan dan ArgumentCaptors terlalu membosankan untuk ditulis.sumber