Menegaskan Pengecualian Dilempar di JUnit 4 dan 5

1. Perkenalan

Dalam tutorial singkat ini, kita akan melihat bagaimana menguji apakah sebuah eksepsi dilemparkan menggunakan pustaka JUnit.

Kami akan, tentu saja, memastikan untuk mencakup versi JUnit 4 dan JUnit 5.

2. JUnit 5

JUnit 5 Jupiter assertions API memperkenalkan metode assertThrows untuk menyatakan pengecualian.

Ini mengambil jenis pengecualian yang diharapkan dan antarmuka fungsional yang dapat dieksekusi di mana kita dapat meneruskan kode yang diuji melalui ekspresi 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)); }

Jika pengecualian yang diharapkan muncul , assertThrows mengembalikan pengecualian, yang memungkinkan kita juga menegaskan pada pesan tersebut.

Selain itu, penting untuk diperhatikan bahwa pernyataan ini terpenuhi ketika kode tertutup melontarkan pengecualian jenis NullPointerException atau jenis turunannya.

Ini berarti bahwa jika kita meneruskan Exception sebagai jenis pengecualian yang diharapkan, setiap pengecualian yang dilemparkan akan membuat pernyataan berhasil karena Exception adalah jenis super untuk semua pengecualian.

Jika kita mengubah pengujian 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)); }

Metode assertThrows () memungkinkan kontrol yang lebih cermat untuk logika pernyataan pengecualian karena kita bisa menggunakannyaitu di sekitar bagian tertentu dari kode.

3. JUnit 4

Saat menggunakan JUnit 4, kita cukup menggunakan atribut yang diharapkan dari anotasi @Test untuk menyatakan bahwa kita mengharapkan pengecualian untuk dilemparkan ke mana saja dalam metode pengujian beranotasi.

Akibatnya, saat pengujian dijalankan, itu 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 bahwa kami mengharapkan kode pengujian kami menghasilkan NullPointerException .

Ini cukup jika kami hanya tertarik untuk menyatakan bahwa pengecualian dilemparkan.

Saat kita perlu memverifikasi beberapa properti pengecualian lainnya, kita bisa menggunakan aturan ExpectedException .

Mari kita lihat contoh memverifikasi properti pesan dari 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 kami mendeklarasikan aturan ExpectedException . Kemudian dalam pengujian kami, kami menegaskan bahwa kode yang mencoba mengurai nilai Integer akan menghasilkan NumberFormatException dengan pesan "Untuk string input".

4. Kesimpulan

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

Kode sumber lengkap untuk contoh tersedia di GitHub.