Saya memiliki metode pribadi di kelas pengujian saya yang membangun objek yang biasa digunakan Bar
. The Bar
konstruktor panggilan someMethod()
metode dalam objek saya mengejek:
private @Mock Foo mockedObject; // My mocked object
...
private Bar getBar() {
Bar result = new Bar(mockedObject); // this calls mockedObject.someMethod()
}
Dalam beberapa metode pengujian saya, saya ingin memeriksa someMethod
juga dipanggil oleh tes tertentu. Sesuatu seperti yang berikut ini:
@Test
public void someTest() {
Bar bar = getBar();
// do some things
verify(mockedObject).someMethod(); // <--- will fail
}
Ini gagal, karena objek yang diejek telah someMethod
dipanggil dua kali. Saya tidak ingin metode pengujian saya peduli dengan efek samping getBar()
metode saya , jadi apakah masuk akal untuk mengatur ulang objek tiruan saya di akhir getBar()
?
private Bar getBar() {
Bar result = new Bar(mockedObject); // this calls mockedObject.someMethod()
reset(mockedObject); // <-- is this OK?
}
Saya bertanya, karena dokumentasi menyarankan menyetel ulang objek tiruan umumnya merupakan indikasi tes buruk. Namun, ini terasa baik bagi saya.
Alternatif
Pilihan alternatif tampaknya memanggil:
verify(mockedObject, times(2)).someMethod();
yang menurut saya memaksa setiap tes untuk mengetahui tentang harapan getBar()
, tanpa hasil.
Mockito.clearInvocations(T... mocks)
Diekstrak dari dokumen mockito .
Saran saya adalah Anda mencoba menghindari penggunaan
reset()
. Menurut pendapat saya, jika Anda menelepon dua kali ke beberapa Metode, itu harus diuji (mungkin itu adalah akses basis data, atau proses panjang lainnya yang ingin Anda perhatikan).Jika Anda benar-benar tidak peduli tentang itu, Anda dapat menggunakan:
Perhatikan bahwa yang terakhir ini dapat menyebabkan hasil yang salah, jika Anda memanggil someMethod dari getBar, dan bukan setelah (ini adalah perilaku yang salah, tetapi tes tidak akan gagal).
sumber
verify
metode pribadi saya (yang saya setuju, mungkin tidak termasuk di sana). Saya menyambut komentar Anda tentang apakah jawaban Anda akan berubah.Benar-benar tidak. Seperti yang sering terjadi, kesulitan yang Anda alami dalam menulis tes bersih adalah tanda bahaya utama tentang desain kode produksi Anda. Dalam hal ini, solusi terbaik adalah dengan memperbaiki kode Anda sehingga konstruktor Bar tidak memanggil metode apa pun.
Konstruktor harus membangun, bukan mengeksekusi logika. Ambil nilai pengembalian metode dan berikan sebagai parameter konstruktor.
menjadi:
Jika ini akan menghasilkan duplikasi logika ini di banyak tempat, pertimbangkan membuat metode pabrik yang dapat diuji secara independen dari objek Bar Anda:
Jika refactoring ini terlalu sulit maka menggunakan reset () adalah pekerjaan yang bagus. Tapi mari kita perjelas - ini menunjukkan bahwa kode Anda dirancang dengan buruk.
sumber