Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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 とは何者か

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away