68
66

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2015-08-01

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

68
66
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
68
66

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?