Mockito menguji metode void melempar pengecualian

399

Saya punya metode dengan voidtipe pengembalian. Itu juga bisa melempar sejumlah pengecualian sehingga saya ingin menguji pengecualian yang dilemparkan. Semua upaya gagal dengan alasan yang sama:

Metode ketika (T) dalam tipe Stubber tidak berlaku untuk argumen (batal)

Adakah ide bagaimana saya bisa mendapatkan metode untuk melempar pengecualian yang ditentukan?

doThrow(new Exception()).when(mockedObject.methodReturningVoid(...));
edwardmlyte
sumber
1
Kemungkinan duplikat dari Cara membuat metode mock to void dengan mockito
Willian

Jawaban:

706

Tanda kurung ditempatkan dengan buruk. Anda harus menggunakan

doThrow(new Exception()).when(mockedObject).methodReturningVoid(...);
                                          ^

dan tidak

doThrow(new Exception()).when(mockedObject.methodReturningVoid(...));
                                                                   ^

Ini dijelaskan dalam dokumentasi

JB Nizet
sumber
7
@edwardmlyte Ketidakkonsistenan Mockito ini adalah salah satu alasan saya beralih ke MoxieMocks
Muel
@clement keduanya dapat digunakan: docs.mockito.googlecode.com/hg/latest/org/mockito/… . Membuat pengecualian tidak membuangnya.
JB Nizet
1
@JB Nizet Saya sangat setuju dengan Anda tetapi jika saya menulis doThrow (new Exception ()) alih-alih doThrow (Exception.class), saya memiliki kesalahan berikut ketika saya meluncurkan pengujian saya; Diharapkan pengecualian com.company.project.exception.ElementNotFoundException tapi punya org.mockito.exceptions.base.MockitoException:
clement
2
Ajukan pertanyaan lain, dengan kode yang diuji, kode tes, dan jejak tumpukan pengecualian.
JB Nizet
6
doThrow (Pengecualian baru ()). when (objek) .voidMethod (any ());
Soumyajit Swain
14

Jika Anda pernah bertanya-tanya bagaimana cara melakukannya dengan menggunakan gaya BDD baru Mockito:

willThrow(new Exception()).given(mockedObject).methodReturningVoid(...));

Dan untuk referensi di masa mendatang, seseorang mungkin perlu melemparkan pengecualian dan kemudian tidak melakukan apa pun:

willThrow(new Exception()).willNothing().given(mockedObject).methodReturningVoid(...));
Ondrej Burkert
sumber
1
Terima kasih telah memposting ini di sini; jika metode mengembalikan nilai: diberikan (mockedObject.methodReturningAnObject ()). willThrow (new Exception ()); jika metode tersebut tidak mengembalikan apa pun: willThrow (new Exception ()). diberikan (mockedObject) .methodReturningVoid (...)); Penjelasan bentuk javadoc: "Rongga penghentian memerlukan pendekatan yang berbeda dari {@link Mockito # when (Object)} (atau BDDMockito.given) karena kompiler tidak menyukai metode batal di dalam tanda kurung ..."
Wolf359