Saya memiliki metode berikut yang ingin saya verifikasi perilakunya.
public void methodToTest(Exception e, ActionErrors errors) {
...
errors.add("exception.message",
ActionMessageFactory.createErrorMessage(e.toString()));
errors.add("exception.detail",
ActionMessageFactory.createErrorMessage(e.getStackTrace()[0].toString()));
...
}
Di kelas @Test saya, saya berharap melakukan sesuatu seperti ini untuk memverifikasi yang errors.add()
disebut dengan "exception.message" dan sekali lagi dengan "exception.detail"
verify(errors).add(eq("exception.message"), any(ActionError.class));
verify(errors).add(eq("exception.detail"), any(ActionError.class));
Namun Mockito mengeluh sebagai berikut
Argument(s) are different! Wanted:
actionErrors.add(
"exception.message",
<any>
);
Actual invocation has different arguments:
actionErrors.add(
"exception.detail",
org.apache.struts.action.ActionError@38063806
);
Bagaimana cara memberi tahu Mockito untuk memeriksa kedua nilai?
Mockito.reset()
Jawaban:
Bacaan lebih lanjut telah membuat saya mencoba menggunakan ArgumentCaptors dan karya-karya berikut, meskipun jauh lebih bertele-tele daripada yang saya inginkan.
sumber
methodToTest()
tepat satu kali, oleh karena itu jawaban ini memverifikasi bahwa kedua panggilan dibuat bersamaan. RekamanList<String> values
yang sedang ditegaskan hanya akan berisi dua nilai yang sedang diuji dan tidak ada yang lain. Anda juga bisa menambahkanassertTrue(values.size == 2)
. Jika ini yang Anda inginkan, saya akan mengganti 3 pernyataan assertTrue dengan satu Hamcrest ...assertThat(values, contains("exception.message", "exception.detail"));
methodToTest()
sekali. Ini adalah metode argumenActionErrors errors
yang dipanggil secara internal dua kali.Jika urutan kedua
add()
panggilan relevan, Anda dapat menggunakanInOrder
:sumber
errors
argumen:InOrder inOrder = inOrder(errors);
(lihat dokumen )List
menjadiSet
dan tegaskan bahwa Kumpulan masukan sama dengan himpunan yang diberikan oleh argumen menangkap.Coba sesuatu seperti ini:
sumber
Anda mungkin memiliki masalah dalam kode Anda. Karena sebenarnya Anda menulis kode ini:
Perhatikan bahwa verifikasi pertama bahkan tidak dalam urutan sehubungan dengan pemanggilan yang sebenarnya.
Selain itu, saya akan menyarankan Anda untuk tidak mengejek tipe yang tidak Anda miliki, misalnya tipe struts.
[EDIT @Brad]
Setelah menjalankan kode Brice (di atas) di IDE saya, saya dapat melihat bahwa saya telah menggunakan ActionError alih-alih ActionMessage, jadi itulah mengapa verifikasi () saya tidak cocok. Pesan kesalahan yang awalnya saya posting menyesatkan saya sehingga mengira itu adalah argumen pertama yang tidak cocok. Ternyata itu argumen kedua.
Jadi jawaban atas pertanyaan saya adalah
sumber
InOrder
.Anda dapat menggunakan
Mockito.atLeastOnce()
yang memungkinkan Mockito lulus ujian meskipun mockObject itu akan dipanggil berkali-kali.sumber
1) Beritahu Mokito jumlah panggilan yang diharapkan.
2) Beritahu Mokito berapa kali diharapkan setiap kombinasi parameter.
sumber
Dengan cara yang mirip dengan @ sendon1928 kita dapat menggunakan:
untuk memastikan metode dipanggil berkali-kali (solusi yang lebih disukai menurut saya). Setelah itu, kita bisa menelepon
Untuk memastikan bahwa tiruan itu tidak digunakan lebih lanjut dalam konteks apa pun. Contoh lengkap:
sumber