Apakah ada cara agar metode stubbed mengembalikan objek yang berbeda pada pemanggilan berikutnya? Saya ingin melakukan ini untuk menguji tanggapan yang tidak ditentukan dari ExecutorCompletionService
. yaitu untuk menguji bahwa terlepas dari urutan pengembalian metode, hasilnya tetap konstan.
Kode yang ingin saya uji terlihat seperti ini.
// Create an completion service so we can group these tasks together
ExecutorCompletionService<T> completionService =
new ExecutorCompletionService<T>(service);
// Add all these tasks to the completion service
for (Callable<T> t : ts)
completionService.submit(request);
// As an when each call finished, add it to the response set.
for (int i = 0; i < calls.size(); i ++) {
try {
T t = completionService.take().get();
// do some stuff that I want to test
} catch (...) { }
}
doAnswer
atau untuk menulisAnswer
dalam kasus yang Anda sebutkan. Anda bisa menggunakannyadoReturn(...).when(someSpy).someMethod(...)
. Tampaknya masuk akal untuk berasumsi bahwa Emma lebih tertarik pada ejekan, daripada mata-mata, tetapi saya rasa saya bisa menambahkan sesuatu ke jawaban saya untuk menguraikan ini. Terima kasih atas komentarnya.Seperti yang ditunjukkan sebelumnya, hampir semua panggilan dapat dilakukan dengan rantai.
Jadi kamu bisa menelepon
Info lebih lanjut di Dokumentasi Mockito .
sumber
mock.method
dipanggil dalam contoh ini? Saya menginginkan sesuatu seperti, kembalikan foo pertama kali tetapi kembalikan bar untuk SEMUA sisanya.Anda bahkan dapat
doReturn()
mengaitkan pemanggilan metode seperti iniimut bukan :)
sumber
Saya telah menerapkan
MultipleAnswer
kelas yang membantu saya untuk mematikan jawaban yang berbeda dalam setiap panggilan. Berikut potongan kode:sumber
Mengikuti dapat digunakan sebagai metode umum untuk mengembalikan argumen yang berbeda pada panggilan metode yang berbeda. Satu-satunya hal yang perlu kita lakukan adalah kita harus melewati array dengan urutan objek mana yang harus diambil dalam setiap panggilan.
Ex.
getAnswerForSubsequentCalls(mock1, mock3, mock2);
akan mengembalikan objek mock1 pada panggilan pertama, objek mock3 pada panggilan kedua dan objek mock2 pada panggilan ketiga. Harus digunakan sepertiwhen(something()).doAnswer(getAnswerForSubsequentCalls(mock1, mock3, mock2));
ini hampir mirip denganwhen(something()).thenReturn(mock1, mock3, mock2);
sumber
Terkait dengan jawaban @ [Igor Nikolaev] dari 8 tahun yang lalu, menggunakan
Answer
can dapat disederhanakan menggunakan ekspresi lambda yang tersedia di Java 8.atau lebih sederhana:
sumber
Gaya BDD:
sumber
sumber