AssertJの紹介

AssertJの概要

1. Overview

この記事では、AssertJ(Javaテストで流暢で豊富なアサーションを作成するために使用されるオープンソースのコミュニティ駆動型ライブラリ)について説明します。

この記事では、AssertJ-coreと呼ばれる基本的なAssertJモジュールで使用できるツールに焦点を当てています。

2. Maven Dependencies

AssertJを使用するには、pom.xmlファイルに次のセクションを含める必要があります。


    org.assertj
    assertj-core
    3.4.1
    test

この依存関係は、基本的なJavaアサーションのみを対象としています。 高度なアサーションを使用する場合は、追加のモジュールを個別に追加する必要があります。

Java 7以前では、AssertJコアバージョン2.x.xを使用する必要があることに注意してください。

最新バージョンはhereで見つけることができます。

3. 前書き

AssertJには、次の目的のために流andで美しいアサーションを簡単に記述できるクラスとユーティリティメソッドのセットが用意されています。

  • 標準Java

  • Java 8

  • グアバ

  • ジョーダ時間

  • Neo4Jおよび

  • Swingコンポーネント

すべてのモジュールの詳細なリストは、プロジェクトのwebsiteで入手できます。

AssertJのドキュメントから、いくつかの例から始めましょう。

assertThat(frodo)
  .isNotEqualTo(sauron)
  .isIn(fellowshipOfTheRing);

assertThat(frodo.getName())
  .startsWith("Fro")
  .endsWith("do")
  .isEqualToIgnoringCase("frodo");

assertThat(fellowshipOfTheRing)
  .hasSize(9)
  .contains(frodo, sam)
  .doesNotContain(sauron);

上記の例は氷山の一角にすぎませんが、このライブラリを使用してアサーションを記述する方法の概要を説明します。

4. AssertJ in Action

このセクションでは、AssertJの設定とその可能性の調査に焦点を当てます。

4.1. 入門

クラスパス上のライブラリのjarを使用すると、テストクラスに単一の静的インポートを追加するのと同じくらい簡単にアサーションを有効にできます。

import static org.assertj.core.api.Assertions.*;

4.2. アサーションを書く

アサーションを作成するには、常にオブジェクトをAssertions.assertThat()メソッドに渡すことから始めて、実際のアサーションを実行する必要があります。

他のいくつかのライブラリとは異なり、以下のコードは実際にはまだ何もアサートしておらず、neverはテストに失敗することを覚えておくことが重要です。

assertThat(anyRefenceOrValue);

IDEのコード補完機能を活用すると、非常にわかりやすいメソッドにより、AssertJアサーションの記述が非常に簡単になります。 IntelliJ IDEA 16では次のようになります。

IDE’s code completion features

IDEのコード補完機能

 

ご覧のとおり、選択できるコンテキストメソッドは数十あり、それらはStringタイプでのみ使用できます。 このAPIのいくつかを詳細に調べて、いくつかの特定のアサーションを見てみましょう。

4.3. Objectアサーション

Objectsは、2つのオブジェクトが等しいかどうかを判断するため、またはオブジェクトのフィールドを調べるために、さまざまな方法で比較できます。

2つのオブジェクトの同等性を比較できる2つの方法を見てみましょう。 次の2つのDogオブジェクトfidofidosCloneが与えられます。

public class Dog {
    private String name;
    private Float weight;

    // standard getters and setters
}

Dog fido = new Dog("Fido", 5.25);

Dog fidosClone = new Dog("Fido", 5.25);

同等性を次のアサーションと比較できます。

assertThat(fido).isEqualTo(fidosClone);

isEqualTo()がオブジェクト参照を比較するため、これは失敗します。 代わりにそれらのコンテンツを比較したい場合は、次のようにisEqualToComparingFieldByFieldRecursively()を使用できます。

assertThat(fido).isEqualToComparingFieldByFieldRecursively(fidosClone);

1つのオブジェクトの各フィールドが他のオブジェクトのフィールドと比較されるため、フィールド比較による再帰フィールドを実行する場合、FidofidosCloneは等しくなります。

オブジェクトを比較および縮小したり、フィールドを調べたりアサートしたりするさまざまな方法を提供するアサーションメソッドは他にもたくさんあります。 それらすべてを見つけるには、公式のAbstractObjectAssertdocumentationを参照してください。

4.4. Booleanアサーション

真理値テストにはいくつかの簡単な方法があります。

  • isTrue()

  • isFalse()

それらの動作を見てみましょう。

assertThat("".isEmpty()).isTrue();

4.5. Iterable/Arrayアサーション

IterableまたはArrayの場合、それらのコンテンツが存在することを表明する方法は複数あります。 最も一般的なアサーションの1つは、IterableまたはArrayに特定の要素が含まれているかどうかを確認することです。

List list = Arrays.asList("1", "2", "3");

assertThat(list).contains("1");

または、Listが空でない場合:

assertThat(list).isNotEmpty();

または、Listが特定の文字で始まる場合。 たとえば、「1」:

assertThat(list).startsWith("1");

同じオブジェクトに対して複数のアサーションを作成する場合、それらを簡単に結合できることに留意してください。

提供されたリストが空ではなく、「1」要素を含み、NULLを含まず、要素「2」、「3」のシーケンスを含むかどうかを確認するアサーションの例を次に示します。

assertThat(list)
  .isNotEmpty()
  .contains("1")
  .doesNotContainNull()
  .containsSequence("2", "3");

もちろん、これらのタイプにはさらに多くの可能なアサーションが存在します。 それらすべてを見つけるには、公式のAbstractIterableAssertdocumentationを参照してください。

4.6. Characterアサーション

文字タイプのアサーションには、ほとんどの場合、比較が含まれ、特定の文字がUnicodeテーブルからのものであるかどうかのチェックも含まれます。

指定された文字が「a」ではなく、Unicodeテーブルにあり、「b」より大きく、小文字であるかどうかを確認するアサーションの例を次に示します。

assertThat(someCharacter)
  .isNotEqualTo('a')
  .inUnicode()
  .isGreaterThanOrEqualTo('b')
  .isLowerCase();

すべての文字タイプのアサーションの詳細なリストについては、AbstractCharacterAssertdocumentationを参照してください。

4.7. Classアサーション

Classタイプのアサーションは、主にそのフィールド、Classタイプ、アノテーションの存在、およびクラスのファイナリティのチェックに関するものです。

クラスRunnableがインターフェースであることを表明したい場合は、単に次のように書く必要があります。

assertThat(Runnable.class).isInterface();

または、一方のクラスが他方から割り当て可能かどうかを確認する場合:

assertThat(Exception.class).isAssignableFrom(NoSuchElementException.class);

考えられるすべてのClassアサーションは、AbstractClassAssertdocumentationで表示できます。

4.8. Fileアサーション

Fileアサーションは、特定のFileインスタンスが存在するか、ディレクトリまたはファイルであるか、特定のコンテンツがあるか、読み取り可能か、または拡張子が指定されているかどうかを確認することを目的としています。

ここでは、特定のファイルが存在するかどうかを確認するアサーションの例を見ることができます。ファイルではなくディレクトリであり、読み取りおよび書き込みが可能です。

 assertThat(someFile)
   .exists()
   .isFile()
   .canRead()
   .canWrite();

可能なすべてのクラスアサーションは、AbstractFileAssertdocumentationで表示できます。

4.9. Double/Float/Integerアサーション

Double/Float/Integerおよびその他のNumberタイプ

数値表明は、特定のオフセット内またはオフセットなしの数値の比較に関するものです。 たとえば、指定された精度に従って2つの値が等しいかどうかを確認する場合、次のことができます。

assertThat(5.1).isEqualTo(5, withPrecision(1d));

Offsetオブジェクトを生成するために、インポート済みのwithPrecision(Double offset)ヘルパーメソッドを使用していることに注意してください。

その他のアサーションについては、AbstractDoubleAssertdocumentationにアクセスしてください。

4.10. InputStreamアサーション

使用可能なInputStream固有のアサーションは1つだけです。

  • hasSameContentAs(InputStreamが期待されます)

および実行中:

assertThat(given).hasSameContentAs(expected);

4.11. Mapアサーション

Mapアサーションを使用すると、マップに特定のエントリ、エントリのセット、またはキー/値が個別に含まれているかどうかを確認できます。

ここでは、特定のマップが空ではなく、数字キー「2」を含み、数字キー「10」を含まず、エントリを含むかどうかをチェックするアサーションの例を見ることができます。key: 2, value: “a”

assertThat(map)
  .isNotEmpty()
  .containsKey(2)
  .doesNotContainKeys(10)
  .contains(entry(2, "a"));

その他のアサーションについては、AbstractMapAssertdocumentationを参照してください。

4.12. Throwableアサーション

Throwableアサーションでは、たとえば、例外のメッセージ、スタックトレースを検査し、例外がすでにスローされているかどうかを確認または検証できます。

特定の例外がスローされたかどうかをチェックし、「c」で終わるメッセージがあるアサーションの例を見てみましょう。

assertThat(ex).hasNoCause().hasMessageEndingWith("c");

その他のアサーションについては、AbstractThrowableAssertdocumentationを参照してください。

5. アサーションの説明

さらに高い冗長レベルを実現するために、アサーション用に動的に生成されたカスタム記述を作成できます。 これを行うための鍵は、as(String description, Object… args)メソッドです。

このようにアサーションを定義する場合:

assertThat(person.getAge())
  .as("%s's age should be equal to 100", person.getName())
  .isEqualTo(100);

これは、テストを実行すると得られるものです。

[Alex's age should be equal to 100] expected:<100> but was:(34)

6. Java 8

AssertJは、Java8の関数型プログラミング機能を最大限に活用します。 例を詳しく見て、実際の動作を見てみましょう。 まず、Java7でそれをどのように行うかを見てみましょう。

assertThat(fellowshipOfTheRing)
  .filteredOn("race", HOBBIT)
  .containsOnly(sam, frodo, pippin, merry);

ここでは、レースHobbitでコレクションをフィルタリングしていますが、Java 8では次のようなことができます。

assertThat(fellowshipOfTheRing)
  .filteredOn(character -> character.getRace().equals(HOBBIT))
  .containsOnly(sam, frodo, pippin, merry);

このシリーズの今後の記事で、AssertJのJava8機能について説明します。 上記の例は、AssertJのwebsiteから取得したものです。

7. Conclusion

この記事では、AssertJが提供する可能性を、コアJava型の最も一般的なアサーションとともに簡単に調査しました。

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