JavaでのテストはJUnit4が使われていると思いますが、自分としては、それに加えてAssertJをオススメします。
AssertJが使いやすい理由
JUnit4のassertThatと比べてAssertJが使いやすい理由は2つあります。
流れるようなインターフェース
AssertJは「Fluent assertions for java」とトップページに大きく書かれているように、流れるようなインターフェースが最大の特徴です。いちいちドキュメントを調べなくても、IDEの補完機能で適切なメソッドを調べられるので、JUnit4のassertThatに比べて書きやすいです。
拡張がMatcherに比べて遥かに楽
Matcherの拡張対象は「比較方法」で、AssertJの拡張対象は「クラス」なので比較するのは適切ではないかもしれませんが、Matcherの拡張が靴の上から足を掻く感じなのに比べて、AssertJの拡張はシンプルです。
それに、実際にプログラムを書いていると、比較方法の拡張が必要なケースはあまりなく、自作クラスでAssertしたいことの方が圧倒的に多いです。
カスタムAssertionの定義
FooClassのカスタムAssertionは以下のように作れます。Genericsの使い方がちょっと不思議に感じるかもしれませんが、自分で作ってみると納得できます。
public class FooClassAssert extends AbstractAssert<FooClassAssert, FooClass> {
// ここは定型文
public FooClassAssert(FooClass actual) {
super(actual, FooClassAssert.class);
}
// ここも定型文
public static FooClassAssert assertThat(FooClass actual) {
return new FooClassAssert(actual);
}
// 独自Assertion
public FooClassAssert hasValue(String key) {
// ここも定型文
isNotNull();
// Assertionの実質的な本体
if (actual.getValue(key) == null) {
failWithMessage("エラーメッセージ");
}
// メソッドチェーンをするためthisを返す
return this;
}
}
カスタムAssertionの使用
// assertThatを使うためのstatic importは必要
assertThat(fooObj).hasValue("bar");
最後に
AssertJは日本だとびっくりするくらいマイナーなのが残念です。JUnit4のassertThatにモヤモヤしている人は試してみてはどうでしょうか?