Tegaskan Pengecualian dilemparkan di JUnit 4 dan 5

1. Pengenalan

Dalam tutorial ringkas ini, kita akan melihat bagaimana menguji apakah pengecualian dilemparkan menggunakan perpustakaan JUnit.

Kami tentu saja akan memastikan kedua-dua versi JUnit 4 dan JUnit 5.

2. JUnit 5

JUnit 5 Jupiter assertions API memperkenalkan kaedah assertThrows untuk menegaskan pengecualian.

Ini mengambil jenis pengecualian yang diharapkan dan antara muka fungsional yang dapat Dieksekusi di mana kita dapat meneruskan kod yang diuji melalui ungkapan lambda:

@Test public void whenExceptionThrown_thenAssertionSucceeds() { Exception exception = assertThrows(NumberFormatException.class, () -> { Integer.parseInt("1a"); }); String expectedMessage = "For input string"; String actualMessage = exception.getMessage(); assertTrue(actualMessage.contains(expectedMessage)); }

Sekiranya pengecualian yang dijangkakan dilemparkan , assertThrows mengembalikan pengecualian, yang membolehkan kita juga menegaskan pada mesej.

Selanjutnya, penting untuk diperhatikan bahawa pernyataan ini dipenuhi apabila kod terlampir melontarkan pengecualian dari jenis NullPointerException atau mana-mana jenisnya.

Ini bermaksud bahawa jika kita melewati Pengecualian sebagai jenis pengecualian yang diharapkan, pengecualian apa pun yang dilemparkan akan membuat penegasan berjaya kerana Pengecualian adalah jenis super untuk semua pengecualian.

Sekiranya kita mengubah ujian di atas untuk mengharapkan RuntimeException , ini juga akan lulus:

@Test public void whenDerivedExceptionThrown_thenAssertionSucceds() { Exception exception = assertThrows(RuntimeException.class, () -> { Integer.parseInt("1a"); }); String expectedMessage = "For input string"; String actualMessage = exception.getMessage(); assertTrue(actualMessage.contains(expectedMessage)); }

Kaedah assertThrows () membolehkan kawalan yang lebih halus untuk logik penegasan pengecualian kerana kita boleh menggunakandi sekitar bahagian tertentu kod.

3. JUnit 4

Semasa menggunakan JUnit 4, kita hanya dapat menggunakan atribut yang diharapkan dari anotasi @Test untuk menyatakan bahawa kami mengharapkan pengecualian dilemparkan ke mana sahaja dalam kaedah ujian anotasi.

Akibatnya, ketika ujian dijalankan, ia akan gagal jika pengecualian yang ditentukan tidak dilemparkan dan akan lulus jika dilemparkan:

@Test(expected = NullPointerException.class) public void whenExceptionThrown_thenExpectationSatisfied() { String test = null; test.length(); }

Dalam contoh ini, kami telah menyatakan bahawa kami menjangkakan kod ujian kami akan menghasilkan NullPointerException .

Ini cukup jika kita hanya berminat untuk menegaskan bahawa pengecualian dilemparkan.

Apabila kita perlu mengesahkan beberapa sifat pengecualian lain, kita dapat menggunakan peraturan ExpectedException .

Mari kita lihat contoh mengesahkan harta pesanan pengecualian:

@Rule public ExpectedException exceptionRule = ExpectedException.none(); @Test public void whenExceptionThrown_thenRuleIsApplied() { exceptionRule.expect(NumberFormatException.class); exceptionRule.expectMessage("For input string"); Integer.parseInt("1a"); }

Dalam contoh di atas, pertama-tama kita menyatakan peraturan ExpectedException . Kemudian dalam ujian kami, kami menegaskan bahawa kod yang cuba menguraikan nilai Integer akan menghasilkan NumberFormatException dengan mesej "Untuk input string".

4. Kesimpulan

Dalam artikel ini, kami membahas penegasan pengecualian dengan JUnit 4 dan JUnit 5.

Kod sumber lengkap untuk contoh boleh didapati di GitHub.