Java コードに対して JUnit で単体テストを書く際に、throw される例外をテストします。
調べたこと自体はかなり以前なんですが、少しの間フロントエンドに行ってたら、
戻ってきたときに「どうだっけ?」ってなってしまったので、備忘録としてまとめておきます。
検証環境
JUnit: 4.12
方法
以下の 2 つについて記載します。
1. @Test
のオプション expected
を使用して throw される例外クラスを指定する
2. @Rule
で ExpectedException
を指定して throw される例外などをテストメソッド内で指定する
@Test
のオプション expected
を使用して throw される例外クラスを指定する
シンプルではあるものの、throw される例外クラスの検証のみにとどまります。
コードサンプルは以下の通りです。
@Test(expected = IllegalArgumentException.class)
public void createAccountUserNameIsEmpty() {
// followings are test-code should throw IllegalArgumentException
// ...
}
オプション expected
のコードに書いてありますが、メッセージなども検証するためには、
後述する ExpectedException
を利用しましょう。Caused by な例外も検証できます。
Caused by な例外の検証については以下の記事に書かれています。
https://qiita.com/komiya_atsushi/items/082d6a71e475a613338a
@Rule
で ExpectedException
を指定して throw される例外などをテストメソッド内で指定する
先に少しだけ触れましたが、throw される例外クラスだけではなく、例外メッセージも検証できます。
コードサンプルは以下の通りです。
// usage より、必ず public にすること
// constructor が private であることから単に new することはできないため .none() によりオブジェクト生成する
// none() の意味するところは、テスト対象が必ずしも例外を投げるわけではない、ということの模様
@Rule
public ExpectedException expectedException = ExpectedException.none();
@Test
public void createAccountUserNameIsEmpty() {
// 例外クラスの検証
expectedException.expect(IllegalArgumentException.class);
// 例外メッセージの検証
expectedException.expectMessage("Failed to create an account; user name is empty.");
// followings are test-code should throw IllegalArgumentException
// ...
}
気になるけど調べてないこと
コードの説明文をしっかり読んでないという怠惰でもある……。
* @Rule
とは何者か。@Rule
を使いこなせば、より効率的にテストを書ける気がする
* ExpectedException
は TestRule
の実装クラスだが、TestRule
とは何者か