AssertJアサーションでの条件の使用

1概要

このチュートリアルでは、http://joel-costigliola.github.io/assertj/[AssertJライブラリ]を見ていきます。特に、読みやすく保守可能なテストを作成するための条件の定義と使用について説明します。

AssertJの基本は ここ にあります。

2テスト中のクラス

テストケースを書く対象となるターゲットクラスを見てみましょう。

public class Member {
    private String name;
    private int age;

   //constructors and getters
}

3条件を作成する

適切な引数で Condition クラスをインスタンス化するだけでアサーション条件を定義できます。

  • Condition を作成する最も便利な方法は、 Predicate をパラメータとしてとるコンストラクタを使用することです** 。他のコンストラクタでは、サブクラスを作成して matches メソッドをオーバーライドする必要がありますが、これはあまり便利ではありません。

Condition オブジェクトを作成するときは、type引数を指定する必要があります。これは、条件が評価される対象の値の型です。

Member クラスの age フィールドに条件を宣言しましょう。

Condition<Member> senior = new Condition<>(
  m -> m.getAge() >= 60, "senior");

senior 変数は、 Person age に基づいてシニアかどうかをテストする Condition インスタンスを参照するようになりました。

  • コンストラクタの2番目の引数 String “ senior” は、条件が失敗した場合にAssertJ自体がユーザーフレンドリなエラーメッセージを作成するために使用する簡単な説明です。

Person name “ John”を持っているかどうかをチェックするもう1つの条件は、次のようになります。

Condition<Member> nameJohn = new Condition<>(
  m -> m.getName().equalsIgnoreCase("John"),
  "name John"
);

4テストケース

それでは、テストクラスで Condition オブジェクトを使用する方法を見てみましょう。

条件 senior nameJohn がテストクラスのフィールドとして利用可能であると仮定します。

4.1. スカラ値の表明

以下のテストは、 age の値が年功序列のしきい値を上回ったため合格するはずです。

Member member = new Member("John", 65);
assertThat(member).is(senior);

is メソッドを使用したアサーションは成功するので、同じ引数を指定した isNot を使用したアサーションは失敗します。

----//assertion fails with an error message containing "not to be <senior>"
assertThat(member).isNot(senior);
----

nameJohn 変数を使用して、2つの同様のテストを書くことができます。

Member member = new Member("Jane", 60);
assertThat(member).doesNotHave(nameJohn);
//assertion fails with an error message containing "to have:\n <name John>"
assertThat(member).has(nameJohn);
  • is has メソッド、そして isNot doesNotHave メソッドは同じ意味を持ちます** 。どちらを使用するかは選択の問題です。それでも、テストコードを読みやすくするものを選択することをお勧めします。

4.2. アサーションコレクション

条件はスカラー値だけでは機能しません** が、コレクション内の要素の有無を確認することもできます。

List<Member> members = new ArrayList<>();
members.add(new Member("Alice", 50));
members.add(new Member("Bob", 60));

assertThat(members).haveExactly(1, senior);
assertThat(members).doNotHave(nameJohn);

haveExactly メソッドは、指定された Condition を満たす要素の正確な数を表明します。一方、 doNotHave メソッドは、要素がないことを確認します。

メソッド haveExactly および doNotHave は、収集条件を扱う唯一のものではありません。これらのメソッドの完全なリストは、APIドキュメントのhttp://joel-costigliola.github.io/assertj/core-8/api/org/assertj/core/api/AbstractIterableAssert.html[AbstractIterableAssertクラス]を参照してください。

4.3. 組み合わせ条件

  • Assertions クラスの3つの静的メソッドを使用してさまざまな条件を組み合わせることができます。

  • not - は、指定された条件が満たされた場合に満たされる条件を作成します。

会わない allOf – ** は、すべての条件を満たす場合にのみ満たされる条件を作成します。

指定した条件が満たされている anyOf - ** は、少なくとも1つの条件を満たす場合に満たされる条件を作成します。

指定した条件が満たされている

not allOf メソッドを使って条件を組み合わせる方法は次のとおりです。

Member john = new Member("John", 60);
Member jane = new Member("Jane", 50);

assertThat(john).is(allOf(senior, nameJohn));
assertThat(jane).is(allOf(not(nameJohn), not(senior)));

同様に、 anyOf を利用することができます。

Member john = new Member("John", 50);
Member jane = new Member("Jane", 60);

assertThat(john).is(anyOf(senior, nameJohn));
assertThat(jane).is(anyOf(nameJohn, senior));

5結論

このチュートリアルではAssertJの条件と、それを使用してテストコード内で非常に読みやすいアサーションを作成する方法について説明しました。

すべての例とコードスニペットの実装はhttps://github.com/eugenp/tutorials/tree/master/testing-modules/testing[over GitHub]にあります。