Apakah ada cara yang lebih baik untuk menyatakan bahwa metode melempar pengecualian di JUnit 5?
Saat ini, saya harus menggunakan aturan @ untuk memverifikasi bahwa tes saya melempar pengecualian, tetapi ini tidak berfungsi untuk kasus-kasus di mana saya mengharapkan beberapa metode untuk melemparkan pengecualian dalam pengujian saya.
java
junit
junit5
junit-jupiter
steventrouble
sumber
sumber
Jawaban:
Anda dapat menggunakan
assertThrows()
, yang memungkinkan Anda menguji beberapa pengecualian dalam pengujian yang sama. Dengan dukungan untuk lambdas di Jawa 8, ini adalah cara kanonik untuk menguji pengecualian di JUnit.Per dokumen JUnit :
sumber
() ->
menunjuk ke ekspresi lambda yang menerima nol argumen. Dengan demikian, "kode produksi" yang diharapkan untuk membuang pengecualian ada di blok kode yang ditunjukkan (yaitu,throw new...
pernyataan dalam kurung keriting).Di Java 8 dan JUnit 5 (Jupiter) kita dapat menyatakan pengecualian sebagai berikut. Menggunakan
org.junit.jupiter.api.Assertions.assertThrows
Pendekatan itu akan menggunakan Interface Fungsional
Executable
diorg.junit.jupiter.api
.Merujuk:
sumber
assertThrows(NoSuchElementException.class, myLinkedList::getFirst);
Mereka telah mengubahnya di JUnit 5 (diharapkan: InvalidArgumentException, aktual: metode yang dipanggil) dan kode terlihat seperti ini:
sumber
Sekarang Junit5 menyediakan cara untuk menegaskan pengecualian
Anda dapat menguji pengecualian umum dan pengecualian khusus
Skenario pengecualian umum:
ExpectGeneralException.java
ExpectGeneralExceptionTest.java
Anda dapat menemukan sampel untuk menguji CustomException di sini: menegaskan contoh kode pengecualian
ExpectCustomException.java
ExpectCustomExceptionTest.java
sumber
Saya pikir ini adalah contoh yang lebih sederhana
Memanggil
get()
opsional yang berisi kosongArrayList
akan melempar aNoSuchElementException
.assertThrows
mendeklarasikan pengecualian yang diharapkan dan memberikan pemasok lambda (tidak mengambil argumen dan mengembalikan nilai).Terima kasih kepada @prime atas jawabannya yang mudah-mudahan saya uraikan.
sumber
assertThrows
mengembalikan pengecualian yang dilemparkan. Jadi, Anda dapat melakukannya seperti diNoSuchElementException e = assertThrows(NoSuchElementException.class, () -> opt2.get());
bawah ini. Anda dapat melakukan semacam pernyataan tentang objek pengecualian yang Anda inginkan.Anda bisa menggunakannya
assertThrows()
. Contoh saya diambil dari dokumen http://junit.org/junit5/docs/current/user-guide/sumber
Satu liner yang bahkan lebih sederhana. Tidak diperlukan ekspresi lambda atau kurung kurawal untuk contoh ini menggunakan Java 8 dan JUnit 5
sumber
Sebenarnya saya pikir ada kesalahan dalam dokumentasi untuk contoh khusus ini. Metode yang dimaksudkan adalah expectThrows
sumber
Ini cara yang mudah.
Itu hanya berhasil ketika Pengecualian yang Anda harapkan dilemparkan.
sumber