Saya telah menulis beberapa tes JUnit dengan @Test
anotasi. Jika metode pengujian saya melempar pengecualian yang diperiksa dan jika saya ingin menegaskan pesan bersama dengan pengecualian, apakah ada cara untuk melakukannya dengan @Test
anotasi JUnit ? AFAIK, JUnit 4.7 tidak menyediakan fitur ini tetapi apakah ada versi di masa depan yang menyediakannya? Saya tahu di .NET Anda dapat menegaskan pesan dan kelas pengecualian. Mencari fitur serupa di dunia Java.
Ini yang aku inginkan:
@Test (expected = RuntimeException.class, message = "Employee ID is null")
public void shouldThrowRuntimeExceptionWhenEmployeeIDisNull() {}
@expectedExceptionMessage
anotasi di PHPUnit.Jawaban:
Anda dapat menggunakan
@Rule
anotasi denganExpectedException
, seperti ini:Perhatikan bahwa contoh dalam
ExpectedException
dokumen tersebut (saat ini) salah - tidak ada konstruktor publik, jadi Anda harus menggunakannyaExpectedException.none()
.sumber
expectMessage
ditentukan sebagai string kosong, perbandingan untuk pesan tidak dilakukanthrows RuntimeException
setelah menambahkan kode yang melempar pengecualian. Jangan tangkap ...failure.expectMessage(CoreMatchers.equalTo(...))
Saya suka
@Rule
jawabannya. Namun, jika karena alasan tertentu Anda tidak ingin menggunakan aturan. Ada opsi ketiga.sumber
Apakah Anda harus menggunakan
@Test(expected=SomeException.class)
? Ketika kita harus menegaskan pesan pengecualian yang sebenarnya, inilah yang kita lakukan.sumber
@Test(expected=...)
danExpectedException
, adalah bahwa saya telah melihat pada banyak kesempatan seseorang lupa untuk meneleponfail()
di akhirtry
blok . Jika tidak tertangkap oleh tinjauan kode, tes Anda mungkin salah-positif dan selalu lulus.Di JUnit 4.13 Anda dapat melakukan:
Ini juga berfungsi di JUnit 5 tetapi dengan impor berbeda:
sumber
Sebenarnya, penggunaan terbaik adalah dengan coba / tangkap. Mengapa? Karena Anda dapat mengontrol tempat di mana Anda mengharapkan pengecualian.
Pertimbangkan contoh ini:
Bagaimana jika suatu hari kode dimodifikasi dan persiapan ujian akan melempar RuntimeException? Dalam hal ini tes yang sebenarnya bahkan tidak diuji dan bahkan jika itu tidak membuang pengecualian tes akan berlalu.
Itulah mengapa jauh lebih baik menggunakan try / catch daripada mengandalkan anotasi.
sumber
RuntimeException
sebagai contoh, ganti pengecualian ini dengan pengecualian lainnya.Raystorm punya jawaban yang bagus. Saya juga bukan penggemar berat Aturan. Saya melakukan sesuatu yang serupa, kecuali bahwa saya membuat kelas utilitas berikut untuk membantu keterbacaan dan kegunaan, yang merupakan salah satu plus besar anotasi di tempat pertama.
Tambahkan kelas utilitas ini:
Kemudian untuk pengujian unit saya, yang saya butuhkan adalah kode ini:
sumber
Jika menggunakan @Rule, set pengecualian diterapkan ke semua metode pengujian di kelas Tes.
sumber
Saya tidak pernah menyukai cara menyatakan pengecualian dengan Junit. Jika saya menggunakan "yang diharapkan" dalam anotasi, tampaknya dari sudut pandang saya, kami melanggar pola "diberikan, kapan, lalu" karena "maka" ditempatkan di bagian atas definisi pengujian.
Juga, jika kita menggunakan "Aturan", kita harus berurusan dengan kode boilerplate begitu banyak. Jadi, jika Anda dapat menginstal pustaka baru untuk tes Anda, saya sarankan untuk melihat AssertJ (pustaka yang sekarang dilengkapi dengan SpringBoot)
Kemudian tes yang tidak melanggar prinsip "diberikan / kapan / kemudian", dan itu dilakukan dengan menggunakan AssertJ untuk memverifikasi:
1 - Pengecualian adalah yang kami harapkan. 2 - Ini juga pesan yang diharapkan
Akan terlihat seperti ini:
sumber
Saya suka jawaban user64141 tetapi menemukan bahwa itu bisa lebih digeneralisasi. Inilah pendapat saya:
Perhatikan bahwa meninggalkan pernyataan "gagal" dalam blok uji coba menyebabkan pengecualian pernyataan terkait ditangkap; menggunakan return dalam pernyataan catch mencegah hal ini.
sumber
Impor perpustakaan catch-exception , dan gunakan itu. Ini jauh lebih bersih daripada
ExpectedException
aturan atautry-catch
.Contoh dari dokumen mereka:
sumber
sumber
Junit
tetapi jawaban Anda adalah memberiTestNG