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

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

 

1. 概要

このチュートリアルでは、the AssertJ libraryを見ていきます。特に、条件を定義して使用し、読み取り可能で保守可能なテストを作成します。

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

2. テスト対象のクラス

テストケースを作成する対象のターゲットクラスを見てみましょう。

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

    // constructors and getters
}

3. 条件の作成

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

The most convenient way to create a Condition is to use the constructor that takes a Predicate as a parameter。 他のコンストラクターでは、サブクラスを作成し、matchesメソッドをオーバーライドする必要がありますが、これはあまり便利ではありません。

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

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

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

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

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

Personnameの「ジョン」があるかどうかを確認する別の条件は次のようになります。

Condition 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 "
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 "
assertThat(member).has(nameJohn);

The is and has methods, as well as the isNot and doesNotHave methods have the same semantics。 どちらを使用するかは選択の問題です。 それでも、テストコードを読みやすくするものを選択することをお勧めします。

4.2. コレクションの主張

条件はスカラー値but they can also verify the existence or non-existence of elements in a collection.でのみ機能するわけではありません。テストケースを見てみましょう。

List 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メソッドは要素がないかどうかをチェックします。

収集条件を処理するのは、メソッドhaveExactlydoNotHaveだけではありません。 これらのメソッドの完全なリストについては、APIドキュメントのthe AbstractIterableAssert classを参照してください。

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条件と、それらを使用してテストコードで非常に読みやすいアサーションを作成する方法のガイドを提供しました。

すべての例とコードスニペットの実装はover on GitHubにあります。