Java >> Java チュートリアル >  >> Tag >> assert

AssertJ によるカスタム アサーション

この記事はシリーズの一部です:• AssertJ の紹介
• Guava の AssertJ
• AssertJ の Java 8 機能
• AssertJ によるカスタム アサーション (現在の記事)

1.概要

このチュートリアルでは、カスタム AssertJ アサーションの作成について説明します。 AssertJ の基本はここにあります。

簡単に言えば、カスタム アサーションを使用すると、独自のクラスに固有のアサーションを作成でき、テストがドメイン モデルをより適切に反映できるようになります。

2.テスト中のクラス

このチュートリアルのテスト ケースは、Person を中心に構築されます。 クラス:

public class Person {
    private String fullName;
    private int age;
    private List<String> nicknames;

    public Person(String fullName, int age) {
        this.fullName = fullName;
        this.age = age;
        this.nicknames = new ArrayList<>();
    }

    public void addNickname(String nickname) {
        nicknames.add(nickname);
    }

    // getters
}

3.カスタム アサーション クラス

カスタム AssertJ アサーション クラスの作成は非常に簡単です。 必要なのは、AbstractAssert を拡張するクラスを宣言することだけです 、必要なコンストラクターを追加し、カスタム アサーション メソッドを提供します。

アサーション クラスは AbstractAssert を拡張する必要があります isNotNull など、API の重要なアサーション メソッドへのアクセスを提供するクラス そしてisEqualTo .

Person のカスタム アサーション クラスのスケルトンは次のとおりです。 :

public class PersonAssert extends AbstractAssert<PersonAssert, Person> {

    public PersonAssert(Person actual) {
        super(actual, PersonAssert.class);
    }

    // assertion methods described later
}

AbstractAssert を拡張するときは、2 つの型引数を指定する必要があります class:1 つ目はメソッド チェーンに必要なカスタム アサーション クラスそのもので、2 つ目はテスト対象のクラスです。

アサーション クラスへのエントリ ポイントを提供するために、アサーション チェーンを開始するために使用できる静的メソッドを定義できます。

public static PersonAssert assertThat(Person actual) {
    return new PersonAssert(actual);
}

次に、PersonAssert に含まれるいくつかのカスタム アサーションについて説明します。 クラス。

最初のメソッドは、Person のフルネームを検証します。 文字列にマッチ 引数:

public PersonAssert hasFullName(String fullName) {
    isNotNull();
    if (!actual.getFullName().equals(fullName)) {
        failWithMessage("Expected person to have full name %s but was %s", 
          fullName, actual.getFullName());
    }
    return this;
}

次のメソッドは、Person かどうかをテストします。 年齢に基づいて成人です :

public PersonAssert isAdult() {
    isNotNull();
    if (actual.getAge() < 18) {
        failWithMessage("Expected person to be adult");
    }
    return this;
}

ニックネームの存在の最後のチェック :

public PersonAssert hasNickName(String nickName) {
    isNotNull();
    if (!actual.getNickNames().contains(nickName)) {
        failWithMessage("Expected person to have nickname %s", 
          nickName);
    }
    return this;
}

複数のカスタム アサーション クラスがある場合、すべての assertThat をラップできます クラス内のメソッド。各アサーション クラスに静的ファクトリ メソッドを提供します。

public class Assertions {
    public static PersonAssert assertThat(Person actual) {
        return new PersonAssert(actual);
    }

    // static factory methods of other assertion classes
}

アサーション 上記のクラスは、すべてのカスタム アサーション クラスへの便利なエントリ ポイントです。

このクラスの静的メソッドは同じ名前を持ち、パラメーターの型によって互いに区別されます。

4.活動中

次のテスト ケースは、前のセクションで作成したカスタム アサーション メソッドを示しています。 assertThat メソッドはカスタム Assertions からインポートされます コアの AssertJ API ではありません。

hasFullName の方法は次のとおりです。 メソッドを使用できます:

@Test
public void whenPersonNameMatches_thenCorrect() {
    Person person = new Person("John Doe", 20);
    assertThat(person)
      .hasFullName("John Doe");
}

これは、isAdult を説明するネガティブ テスト ケースです。 メソッド:

@Test
public void whenPersonAgeLessThanEighteen_thenNotAdult() {
    Person person = new Person("Jane Roe", 16);

    // assertion fails
    assertThat(person).isAdult();
}

hasNickname を示す別のテスト メソッド:

@Test
public void whenPersonDoesNotHaveAMatchingNickname_thenIncorrect() {
    Person person = new Person("John Doe", 20);
    person.addNickname("Nick");

    // assertion will fail
    assertThat(person)
      .hasNickname("John");
}

5.アサーション ジェネレーター

オブジェクト モデルに対応するカスタム アサーション クラスを記述することで、非常に読みやすいテスト ケースへの道が開かれます。

ただし、多くのクラスがある場合、それらすべてに対してカスタム アサーション クラスを手動で作成するのは面倒です .ここで、AssertJ アサーション ジェネレーターの出番です。

Maven でアサーション ジェネレーターを使用するには、プラグインを pom.xml に追加する必要があります。 ファイル:

<plugin>
    <groupId>org.assertj</groupId>
    <artifactId>assertj-assertions-generator-maven-plugin</artifactId>
    <version>2.1.0</version>
    <configuration>
        <classes>
            <param>com.baeldung.testing.assertj.custom.Person</param>
        </classes>
    </configuration>
</plugin>

assertj-assertions-generator-maven-plugin の最新バージョン ここで見つけることができます。

クラス 上記のプラグインの要素は、アサーションを生成したいクラスをマークします。プラグインのその他の構成については、この投稿を参照してください。

AssertJ アサーション ジェネレーターは、ターゲット クラスの各パブリック プロパティのアサーションを作成します .各アサーション メソッドの特定の名前は、フィールドまたはプロパティのタイプによって異なります。アサーション ジェネレーターの完全な説明については、このリファレンスを参照してください。

プロジェクトのベース ディレクトリで次の Maven コマンドを実行します。

mvn assertj:generate-assertions

フォルダ target に生成されたアサーション クラスが表示されます。 /generated-test-sources/assertj-assertions .たとえば、生成されたアサーションのエントリ ポイント クラスは次のようになります。

// generated comments are stripped off for brevity

package com.baeldung.testing.assertj.custom;

@javax.annotation.Generated(value="assertj-assertions-generator")
public class Assertions {

    @org.assertj.core.util.CheckReturnValue
    public static com.baeldung.testing.assertj.custom.PersonAssert
      assertThat(com.baeldung.testing.assertj.custom.Person actual) {
        return new com.baeldung.testing.assertj.custom.PersonAssert(actual);
    }

    protected Assertions() {
        // empty
    }
}

これで、生成されたソース ファイルをテスト ディレクトリにコピーし、カスタム アサーション メソッドを追加して、テスト要件を満たすことができます。

注意すべき重要な点の 1 つは、生成されたコードが完全に正しいとは限らないことです。この時点では、ジェネレーターは完成品ではなく、コミュニティが取り組んでいます。

したがって、ジェネレーターを当然のことと考えるのではなく、生活を楽にするサポート ツールとして使用する必要があります。

6.結論

このチュートリアルでは、手動と自動の両方で、AssertJ ライブラリを使用して読み取り可能なテスト コードを作成するためのカスタム アサーションを作成する方法を示しました。

テスト対象のクラスの数が少ない場合は、手動のソリューションで十分です。それ以外の場合は、ジェネレーターを使用する必要があります。

そして、いつものように、すべての例とコード スニペットの実装は GitHub で見つけることができます。

« 前AssertJ の Java 8 機能


Java タグ