Saya mencoba untuk membuat salah satu benda tiruan saya melemparkan Pengecualian yang diperiksa ketika metode tertentu dipanggil. Saya mencoba yang berikut ini.
@Test(expectedExceptions = SomeException.class)
public void throwCheckedException() {
List<String> list = mock(List.class);
when(list.get(0)).thenThrow(new SomeException());
String test = list.get(0);
}
public class SomeException extends Exception {
}
Namun, itu menghasilkan kesalahan berikut.
org.testng.TestException:
Expected exception com.testing.MockitoCheckedExceptions$SomeException but got org.mockito.exceptions.base.MockitoException:
Checked exception is invalid for this method!
Invalid: com.testing.MockitoCheckedExceptions$SomeException
Melihat dokumentasi Mockito , mereka hanya menggunakan RuntimeException
, apakah tidak mungkin untuk membuang Pengecualian yang diperiksa dari objek tiruan dengan Mockito?
Throws
anotasi untuk membuat kompiler menghasilkan bytecode yang sama dengan mendeklarasikan lemparan dalam kode Java yang setara. Lihat [di sini] ( kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/-throws/… ) untuk detail lebih lanjut.Solusinya adalah menggunakan
willAnswer()
metode.Misalnya karya-karya berikut (dan tidak melempar
MockitoException
tetapi sebenarnya melempar yang diperiksaException
seperti yang disyaratkan di sini) menggunakanBDDMockito
:Setara dengan Mockito biasa akan menggunakan
doAnswer
metode inisumber
willAnswer( invocation -> { throw new Exception("abc msg"); }).given(someObj).someMethod(stringArg1);
saat metode kembalivoid
.willThrow()
biasanya memungkinkan, saya telah menulis IntisaridoAnswer
darinhaarman.mockitokotlin2
Perhatikan bahwa secara umum, Mockito tidak memungkinkan melemparkan pengecualian diperiksa selama pengecualian dinyatakan dalam tanda tangan pesan. Misalnya, diberikan
itu legal untuk menulis:
Namun, jika Anda melempar pengecualian yang dicentang tidak dinyatakan dalam metode tanda tangan, mis
Mockito akan gagal saat runtime dengan pesan umum yang agak menyesatkan:
Hal ini dapat menyebabkan Anda untuk percaya bahwa pengecualian diperiksa pada umumnya tidak didukung, tetapi sebenarnya Mockito hanya mencoba untuk memberitahu Anda bahwa ini pengecualian diperiksa tidak berlaku untuk metode ini .
sumber
Ada solusi dengan Kotlin:
Dari mana datangnya
sumber
Ini bekerja untuk saya di Kotlin:
Catatan: Lempar pengecualian apa pun yang ditentukan selain Pengecualian ()
sumber
Exception