mokky14's IT diary

IT関係の仕事メモ、勉強会の感想など書いてます。

ExpectedExeptionを使ってみる

JavaでExceptionが発生する事を検証するテストは以下のように書く事が出来る。

    @Test(expected = IllegalArgumentException.class)
    public void Exceptionの検証() {
        throw new IllegalArgumentException("このメッセージは検証できない");
    }

ただ、このテストケースでは、意図したExceptionが発生する事は検証できるが、そのExceptionの内容の検証を行う事が出来ない。
Exceptionの検証にExpectedExceptionクラスが使えるという情報を貰ったので使い方を確認。

使い方

  1. @Ruleアノテーションを付与し、ExpectedExceptionクラスのインスタンスを取得
  2. テストケースの先頭で、Exceptionについて検証する内容を設定
  3. Exceptionが発生する処理を実行

サンプル

import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;

import static org.hamcrest.Matchers.endsWith;

public class ExpectedExceptionTest {
    // @Ruleを付加するフィールドはpublicフィールドとする
    @Rule
    public ExpectedException expected = ExpectedException.none();

    @Test
    public void ExpectedExceptionを使ったException検証() {
        // 検証する内容を設定
        expected.expect(IllegalArgumentException.class);
        expected.expectMessage("sample");   // 部分一致検証
        expected.expectMessage(endsWith("exception"));

        // Exceptionが発生する処理を実行
        new SampleClass(null);
    }

    static class SampleClass {
        SampleClass(String str) {
            if ( str == null ) {
                throw new IllegalArgumentException("sample exception");
            }
        }
    }
}

このコードで、Exception#getMessage()の内容を検証する事が出来る。
なお、ExpectedException#expectMessage(String)メソッドは部分一致の検証である事に注意。

JUnit実践入門にも載ってた。

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)