kelas publik A { metode public void (boolean b) { jika (b == benar) metode1 (); lain metode2 (); } private void method1 () {} private void method2 () {} }
public class TestA { @Uji public void testMethod () { A a = mock (A.class); a. metode (benar); // cara menguji seperti verifikasi (a) .method1 (); } }
Bagaimana cara menguji metode privat dipanggil atau tidak, dan bagaimana cara menguji metode privat menggunakan mockito ???
Jawaban:
Anda tidak dapat melakukannya dengan Mockito tetapi Anda dapat menggunakan Powermock untuk memperluas Mockito dan metode pribadi tiruan. Powermock mendukung Mockito. Ini contohnya.
sumber
Tidak mungkin melalui mockito. Dari wiki mereka
sumber
Berikut adalah contoh kecil bagaimana melakukannya dengan powermock
Untuk menguji metode1 gunakan kode:
Untuk mengatur private object obj, gunakan ini:
sumber
Pikirkan tentang hal ini dalam kaitannya dengan perilaku, bukan dalam metode apa yang ada. Metode yang dipanggil
method
memiliki perilaku tertentu jikab
benar. Ini memiliki perilaku yang berbeda jikab
salah. Ini berarti Anda harus menulis dua tes berbeda untukmethod
; satu untuk setiap kasus. Jadi, alih-alih memiliki tiga pengujian berorientasi metode (satu untukmethod
, satu untukmethod1
, satu untukmethod2
, Anda memiliki dua pengujian berorientasi perilaku.Terkait dengan ini (saya menyarankan ini di utas SO lain baru-baru ini, dan sebagai hasilnya disebut kata empat huruf, jadi jangan ragu untuk mengambil ini dengan sebutir garam); Saya merasa terbantu untuk memilih nama pengujian yang mencerminkan perilaku yang saya uji, daripada nama metode. Jadi jangan sebut tes Anda
testMethod()
,testMethod1()
,testMethod2()
dan sebagainya. Saya suka nama yang disukaicalculatedPriceIsBasePricePlusTax()
atautaxIsExcludedWhenExcludeIsTrue()
yang menunjukkan perilaku apa yang saya uji; kemudian dalam setiap metode pengujian, uji hanya perilaku yang ditunjukkan. Kebanyakan perilaku tersebut hanya akan melibatkan satu panggilan ke metode publik, tetapi mungkin melibatkan banyak panggilan ke metode privat.Semoga ini membantu.
sumber
Meskipun Mockito tidak menyediakan kemampuan itu, Anda dapat mencapai hasil yang sama menggunakan Mockito + kelas JUnit ReflectionUtils atau kelas Spring ReflectionTestUtils . Silakan lihat contoh di bawah ini yang diambil dari sini yang menjelaskan cara memanggil metode pribadi:
Contoh lengkap dengan ReflectionTestUtils dan Mockito dapat ditemukan di buku Mockito for Spring
sumber
Anda tidak seharusnya menguji metode privat. Hanya metode non-privat yang perlu diuji karena metode ini harus memanggil metode privat. Jika Anda "ingin" menguji metode privat, ini mungkin menunjukkan bahwa Anda perlu memikirkan kembali desain Anda:
Apakah saya menggunakan injeksi ketergantungan yang tepat? Apakah saya mungkin perlu memindahkan metode privat ke kelas terpisah dan lebih baik mengujinya? Haruskah metode ini bersifat pribadi? ... tidak bisakah mereka menjadi default atau dilindungi?
Dalam contoh di atas, dua metode yang disebut "secara acak" mungkin sebenarnya perlu ditempatkan di kelasnya sendiri, diuji, dan kemudian dimasukkan ke dalam kelas di atas.
sumber
Saya dapat menguji metode pribadi di dalam menggunakan mockito menggunakan refleksi. Berikut adalah contohnya, mencoba menamainya sedemikian rupa sehingga masuk akal
sumber
Dengan menggunakan refleksi, metode privat dapat dipanggil dari kelas pengujian. Pada kasus ini,
// metode pengujian akan seperti ini ...
Jika metode privat memanggil metode privat lainnya, maka kita perlu memata-matai objek dan menghentikan metode lain. Kelas pengujian akan seperti ...
// metode pengujian akan seperti ini ...
** Pendekatannya adalah menggabungkan refleksi dan memata-matai objek. ** metode1 dan ** metode2 adalah metode pribadi dan metode1 memanggil metode2.
sumber
Saya tidak begitu mengerti kebutuhan Anda untuk menguji metode privat. Akar masalahnya adalah metode publik Anda memiliki void sebagai tipe kembalian, dan karenanya Anda tidak dapat menguji metode publik Anda. Karenanya Anda dipaksa untuk menguji metode pribadi Anda. Apakah tebakan saya benar ??
Beberapa solusi yang mungkin (AFAIK):
Mengolok-olok metode pribadi Anda, tetapi tetap saja Anda tidak akan "benar-benar" menguji metode Anda.
Verifikasi status objek yang digunakan dalam metode ini. KEBANYAKAN metode melakukan beberapa pemrosesan nilai input dan mengembalikan output, atau mengubah status objek. Menguji objek untuk keadaan yang diinginkan juga dapat digunakan.
Ubah sedikit kode Anda (Semoga ini bukan kode lama). Funda saya menulis metode adalah, seseorang harus selalu mengembalikan sesuatu (a int / a boolean). Nilai yang dikembalikan MUNGKIN atau MUNGKIN TIDAK digunakan oleh implementasi, tetapi PASTI akan digunakan oleh pengujian
kode.
sumber
Sebenarnya ada cara untuk menguji metode dari anggota pribadi dengan Mockito. Katakanlah Anda memiliki kelas seperti ini:
Jika Anda ingin menguji
a.method
akan memanggil metode dariSomeOtherClass
, Anda dapat menulis sesuatu seperti di bawah ini.ReflectionTestUtils.setField();
akan menghentikan anggota pribadi dengan sesuatu yang dapat Anda mata-matai.sumber
Letakkan pengujian Anda dalam paket yang sama, tetapi folder sumber berbeda (src / main / java vs. src / test / java) dan jadikan metode tersebut sebagai paket pribadi. Kemampuan untuk diuji lebih penting daripada privasi.
sumber
Jika metode privat tidak kosong dan nilai yang dikembalikan digunakan sebagai parameter untuk metode dependensi eksternal, Anda dapat memalsukan dependensi dan menggunakan an
ArgumentCaptor
untuk menangkap nilai yang dikembalikan. Sebagai contoh:sumber