1概要

このチュートリアルでは、カスタムのhttp://joel-costigliola.github.io/assertj/[AssertJ]アサーションの作成について説明します。 AssertJの基本リンク:/Introduction-to-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



isEqualTo

など、APIの重要なアサーションメソッドにアクセスできるようにする必要があります。

これが

Person

のカスタムアサーションクラスのスケルトンです。

public class PersonAssert extends AbstractAssert<PersonAssert, Person> {

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

   //assertion methods described later
}


AbstractAssert

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

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

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

次に、

PersonAssert

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

最初のメソッドは、

Person

のフルネームが

String

引数と一致することを確認します。

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



age

に基づいて大人であるかどうかをテストします。

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

最後のものは

nickname

の存在をチェックします。

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
}

上記の

Assertions

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

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


4実行中

次のテストケースでは、前のセクションで作成したカスタムアサーションメソッドを説明します。

assertThat

メソッドは、コアのAssertJ APIではなく、カスタムの

Assertions

クラスからインポートされています。

これが

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

の最新バージョンはhttps://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.assertj%22%20AND%20a%にあります3A%22assertj-assertions-generator-maven-plugin%22[ここ]。

上記のプラグインの

classes

要素は、アサーションを生成したいクラスをマークします。プラグインのその他の設定についてはhttp://joel-costigliola.github.io/assertj/assertj-assertions-generator-maven-plugin.html#configuration[この投稿]を参照してください。

AssertJアサーションジェネレータは、ターゲットクラスの各パブリックプロパティに対してアサーションを作成します。各アサーションメソッドの具体的な名前は、フィールドまたはプロパティの種類によって異なります。アサーションジェネレータの詳細については、http://joel-costigliola.github.io/assertj/assertj-assertions-generator.html[このリファレンス]を参照してください。

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

mvn assertj:generate-assertions

フォルダ

target

に生成されたアサーションクラスが生成されたアサーションに対して生成されたエントリポイントクラスは次のようになるはずです。

----//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ライブラリを使用して読み取り可能なテストコードを作成するためのカスタムアサーションを手動でも自動でも作成する方法を説明しました。

テスト対象のクラスが少数しかない場合は、手動による解決方法で十分です。それ以外の場合は、ジェネレータを使用する必要があります。

そして、いつものように、すべての例とコードスニペットの実装はhttps://github.com/eugenp/tutorials/tree/master/testing-modules/testing[GitHubに載っています]。