Bagaimana cara mengejek metode dengan tipe batal?
Saya menerapkan pola pengamat tetapi saya tidak bisa mengejeknya dengan Mockito karena saya tidak tahu caranya.
Dan saya mencoba mencari contoh di Internet tetapi tidak berhasil.
Kelas saya terlihat seperti ini:
public class World {
List<Listener> listeners;
void addListener(Listener item) {
listeners.add(item);
}
void doAction(Action goal,Object obj) {
setState("i received");
goal.doAction(obj);
setState("i finished");
}
private string state;
//setter getter state
}
public class WorldTest implements Listener {
@Test public void word{
World w= mock(World.class);
w.addListener(this);
...
...
}
}
interface Listener {
void doAction();
}
Sistem tidak dipicu dengan mock.
Saya ingin menunjukkan status sistem yang disebutkan di atas. Dan buatlah pernyataan menurut mereka.
Jawaban:
Lihatlah dokumen Mockito API . Sebagai dokumen terkait menyebutkan (Point No. 12) Anda dapat menggunakan salah satu
doThrow()
,doAnswer()
,doNothing()
,doReturn()
keluarga metode dari kerangka Mockito untuk mengejek metode batal.Sebagai contoh,
atau jika Anda ingin menggabungkannya dengan perilaku tindak lanjut,
Menganggap bahwa Anda mencari mengejek setter
setState(String s)
di kelas Dunia di bawah ini adalah kode menggunakandoAnswer
metode untuk mengejeksetState
.sumber
setRate()
adalahfinal
, dan karena itu tidak dapat dipermainkan. Alih-alih mencobacreate()
contoh yang melakukan apa yang Anda butuhkan. Seharusnya tidak perlu mengejekRateLimiter
.Saya pikir saya telah menemukan jawaban yang lebih sederhana untuk pertanyaan itu, untuk memanggil metode nyata hanya untuk satu metode (bahkan jika itu memiliki pengembalian kosong) Anda dapat melakukan ini:
Atau, Anda bisa memanggil metode nyata untuk semua metode kelas itu, melakukan ini:
sumber
Menambahkan apa yang dikatakan @sateesh, ketika Anda hanya ingin mengejek metode kosong untuk mencegah tes memanggilnya, Anda bisa menggunakan
Spy
cara ini:Ketika Anda ingin menjalankan tes Anda, pastikan Anda memanggil metode dalam pengujian pada
spy
objek dan bukan padaworld
objek. Sebagai contoh:sumber
Solusi masalah yang disebut adalah dengan menggunakan
spy
Mockito.spy (...) alih-alihmock
Mockito.mock (..) .Spy memungkinkan kita untuk mengejek sebagian. Mockito pandai dalam hal ini. Karena Anda memiliki kelas yang tidak lengkap, dengan cara ini Anda mengejek beberapa tempat yang diperlukan di kelas ini.
sumber
Pertama-tama: Anda harus selalu mengimpor mockito statis, dengan cara ini kode akan jauh lebih mudah dibaca (dan intuitif):
Untuk mengejek parsial dan tetap mempertahankan fungsionalitas asli, mockito lainnya menawarkan "Spy".
Anda dapat menggunakannya sebagai berikut:
Untuk menghilangkan metode dari eksekusi Anda dapat menggunakan sesuatu seperti ini:
untuk memberikan beberapa perilaku khusus ke metode, gunakan "when" dengan "thenReturn":
Untuk contoh lebih lanjut, silakan temukan sampel mockito yang sangat baik dalam dokumen.
sumber
Cara mempermainkan metode batal dengan mockito - ada dua opsi:
doAnswer
- Jika kita ingin metode batal mengejek kita untuk melakukan sesuatu (mengejek perilaku meskipun batal).doThrow
- Lalu adaMockito.doThrow()
jika Anda ingin melempar pengecualian dari metode batal diejek.Berikut ini adalah contoh cara menggunakannya (bukan usecase yang ideal tetapi hanya ingin menggambarkan penggunaan dasar).
Anda dapat menemukan rincian lebih lanjut tentang cara mengejek dan menguji metode batal dengan Mockito di posting saya Cara mengejek dengan Mockito (Panduan komprehensif dengan contoh)
sumber
Menambahkan jawaban lain ke banyak (tidak ada permainan kata pun dimaksudkan) ...
Anda perlu memanggil metode doAnswer jika Anda tidak dapat \ tidak ingin menggunakan mata-mata. Namun, Anda tidak perlu menggulung Jawaban Anda sendiri . Ada beberapa implementasi standar. Khususnya, CallsRealMethods .
Dalam praktiknya, tampilannya seperti ini:
Atau:
sumber
Di Java 8 ini dapat dibuat sedikit lebih bersih, dengan asumsi Anda memiliki impor statis untuk
org.mockito.Mockito.doAnswer
:Itu
return null;
penting dan tanpa itu kompilasi akan gagal dengan beberapa kesalahan yang cukup tidak jelas karena tidak akan dapat menemukan penggantian yang sesuaidoAnswer
.Misalnya sebuah
ExecutorService
yang langsung mengeksekusi yangRunnable
diteruskan keexecute()
dapat diimplementasikan menggunakan:sumber
Saya pikir masalah Anda disebabkan oleh struktur pengujian Anda. Saya merasa sulit untuk mencampur ejekan dengan metode tradisional mengimplementasikan antarmuka di kelas uji (seperti yang Anda lakukan di sini).
Jika Anda menerapkan pendengar sebagai Mock, Anda dapat memverifikasi interaksinya.
Ini seharusnya memuaskan Anda bahwa 'Dunia' melakukan hal yang benar.
sumber
Menggunakan Mockito.doThrow seperti pada:
Anda dapat mencoba contoh yang bagus ini:
Sumber: http://apisonar.com/java-examples/org.mockito.Mockito.doThrow.html#Example-19
sumber