LoginSignup
29
22

More than 5 years have passed since last update.

【JUnit】throw される例外をテストする

Last updated at Posted at 2018-01-11

Java コードに対して JUnit で単体テストを書く際に、throw される例外をテストします。
調べたこと自体はかなり以前なんですが、少しの間フロントエンドに行ってたら、
戻ってきたときに「どうだっけ?」ってなってしまったので、備忘録としてまとめておきます。

検証環境

JUnit: 4.12

方法

以下の 2 つについて記載します。
1. @Test のオプション expected を使用して throw される例外クラスを指定する
2. @RuleExpectedException を指定して 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

@RuleExpectedException を指定して 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 を使いこなせば、より効率的にテストを書ける気がする
* ExpectedExceptionTestRule の実装クラスだが、TestRule とは何者か

29
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
29
22