JUnitの新しいアサーション assertThat

Junit4.4から assertThat というアサーションメソッドが追加された。
APIの定義は以下の通り。

public static <T> void assertThat(T actual,
                                  org.hamcrest.Matcher<T> matcher)

public static <T> void assertThat(java.lang.String reason,
                                  T actual,
                                  org.hamcrest.Matcher<T> matcher)

以下の様に、英語として読みやすい記述でアサーションを記述できる。

import static org.hamcrest.CoreMatchers.*;

public class Test1 {
    @Test
    public void test() throws Exception {
        assertThat(Integer.parseInt("100"), is(100));
    }
}

否定なども、下記のように読み下しやすく記載できる。

        assertThat(Integer.parseInt("100"), is(not(10)));


このように、assertThatは汎用的なアサーションとして利用できる。matcherとしては以下の2つのクラスがデフォルトで提供されている。

  • org.hamcrest.CoreMatchers
  • org.junit.matchers.JUnitMatchers

org.hamcrest.CoreMatchersのメソッド

allOf Matcherを可変長引数で渡す。全ての比較メソッドがtrueとなるかを評価
anyOf Matcherを可変長引数で渡す。いずれかの比較メソッドがtrueとなるかを評価
anything 常にtrueとなる
describedAs エラー詳細の出力を指定
equalTo Object.equalsメソッドによる同値性を評価
instanceOf 指定したクラスのインスタンスであるかを評価
is assertThat(Integer.parseInt("100"), is(100));
not assertThat(Integer.parseInt("100"), is(not(50));
notNullValue 値がnullでないことを評価
nullValue 値がnullであることを評価
sameInstance 指定したインスタンスと同じであることを評価

詳しくは以下を参照してください

blog1.mammb.com

org.junit.matchers.JUnitMatchersのメソッド

both assertThat(string, both(containsString("a")).and(containsString("b")));
containsString assertThat(string, containsString("a"));
either assertThat(string, either(containsString("a")).or(containsString("b")));
everyItem 指定した全ての値を保持しているかを検証
hasItem 指定した値を保持しているかを検証