Ini pertanyaan yang bagus! Saya pikir akar penyebabnya adalah sebagai berikut, kami menggunakan JUnit tidak hanya untuk pengujian unit. Jadi pertanyaannya harus dipecah:
- Haruskah saya menggunakan Mockito.verify () dalam pengujian integrasi (atau pengujian lebih tinggi dari unit lainnya)?
- Haruskah saya menggunakan Mockito.verify () dalam pengujian unit kotak hitam saya ?
- Haruskah saya menggunakan Mockito.verify () dalam pengujian unit kotak putih saya ?
jadi jika kita akan mengabaikan pengujian yang lebih tinggi dari unit, pertanyaannya dapat diulang kembali " Menggunakan pengujian unit kotak putih dengan Mockito.verify () menciptakan pasangan yang hebat antara pengujian unit dan implementasi saya, dapatkah saya membuat " kotak abu-abu " pengujian unit dan aturan praktis apa yang harus saya gunakan untuk ini ".
Sekarang, mari kita lalui semua langkah demi langkah ini.
* - Haruskah saya menggunakan Mockito.verify () dalam pengujian integrasi (atau pengujian lain yang lebih tinggi dari unit)? * Saya kira jawabannya jelas tidak, apalagi Anda tidak boleh menggunakan ejekan untuk ini. Tes Anda harus sedekat mungkin dengan aplikasi nyata. Anda menguji kasus penggunaan lengkap, bukan bagian yang terisolasi dari aplikasi.
* black-box vs white-box unit-testing * Jika Anda menggunakan pendekatan black-box apa yang sebenarnya Anda lakukan, Anda memberikan input (semua kelas ekuivalensi) input, keadaan , dan tes yang akan menerima output yang diharapkan. Dalam pendekatan ini penggunaan mock pada umumnya dibenarkan (Anda hanya meniru bahwa mereka melakukan hal yang benar; Anda tidak ingin mengujinya), tetapi memanggil Mockito.verify () tidak perlu.
Jika Anda menggunakan pendekatan kotak putih apa yang sebenarnya Anda lakukan, Anda menguji perilaku unit Anda. Dalam pendekatan ini, menelepon ke Mockito.verify () sangat penting, Anda harus memverifikasi bahwa unit Anda berperilaku seperti yang Anda harapkan.
aturan praktis untuk pengujian kotak abu-abu
Masalah dengan pengujian kotak putih adalah menciptakan kopling tinggi. Salah satu solusi yang mungkin adalah melakukan pengujian kotak abu-abu, bukan pengujian kotak putih. Ini adalah semacam kombinasi pengujian kotak hitam & putih. Anda benar-benar menguji perilaku unit Anda seperti dalam pengujian white-box, tetapi secara umum Anda menjadikannya agnostik implementasi bila memungkinkan . Jika memungkinkan, Anda hanya akan membuat centang seperti dalam kotak hitam, hanya menegaskan bahwa output adalah apa yang Anda harapkan. Jadi, inti dari pertanyaan Anda adalah kapan mungkin.
Ini sangat sulit. Saya tidak memiliki contoh yang baik, tetapi saya bisa memberi Anda contoh. Dalam kasus yang disebutkan di atas dengan equals () vs equalsIgnoreCase () Anda tidak boleh memanggil Mockito.verify (), hanya menyatakan output. Jika Anda tidak bisa melakukannya, pecah kode Anda ke unit yang lebih kecil, sampai Anda bisa melakukannya. Di sisi lain, anggaplah Anda memiliki beberapa @Service dan Anda sedang menulis @ Web-Service yang pada dasarnya membungkus @Service Anda - ia mendelegasikan semua panggilan ke @Service (dan membuat beberapa penanganan kesalahan tambahan). Dalam hal ini pemanggilan ke Mockito.verify () penting, Anda tidak boleh menduplikasi semua cek yang Anda lakukan untuk @Serive, memverifikasi bahwa Anda menelepon ke @Service dengan daftar parammeter yang benar sudah cukup.