Java
JUnit
unittest
assertj

JavaのテストにはAssertJがオススメ

More than 3 years have passed since last update.

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にモヤモヤしている人は試してみてはどうでしょうか?