1. 概要

このチュートリアルでは、 AssertJライブラリ、特に条件を定義して使用し、読み取り可能で保守可能なテストを作成する方法について説明します。

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

2. テスト中のクラス

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

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

    // constructors and getters
}

3. 条件の作成

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

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

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

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

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

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

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

Personname“ John”を持っているかどうかを確認する別の条件は、次のようになります。

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

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