1.

概要

この記事では、http://joel-costigliola.github.io/assertj/[AssertJ] – Javaテストで流暢で豊かなアサーションを書くために使用されるオープンソースのコミュニティ駆動型ライブラリー – を探索します。

この記事では、

AssertJ-core

と呼ばれる基本的なAssertJモジュールで利用可能なツールに焦点を当てます。

2.

Mavenの依存関係

AssertJを使用するには、

pom.xml

ファイルに次のセクションを含める必要があります。

<dependency>
    <groupId>org.assertj</groupId>
    <artifactId>assertj-core</artifactId>
    <version>3.4.1</version>
    <scope>test</scope>
</dependency>

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

Java 7以前の場合は、AssertJコアバージョン2.x.xを使用する必要があります。

最新版はhttps://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22assertj-core%22[here]にあります。

3.はじめに

AssertJは、流暢で美しいアサーションを簡単に記述できるようにする一連のクラスとユーティリティメソッドを提供します。

  • 標準Java

  • Java 8

  • グアバ

  • 上田タイム

  • Neo4Jと

  • スイング部品

すべてのモジュールの詳細なリストはプロジェクトのhttp://joel-costigliola.github.io/assertj[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()

メソッドにオブジェクトを渡すことから始める必要があります。その後、実際のアサーションに従います。

他のライブラリとは異なり、以下のコードは実際にはまだ何も宣言しておらず、テストに失敗することはありません。

assertThat(anyRefenceOrValue);

IDEのコード補完機能を利用する場合、AssertJアサーションを記述するのは非常に記述的な方法のために非常に簡単になります。

IntelliJ IDEA 16では、これは次のようになります。

リンク:/uploads/ide-e1466629641205.png%20814w[]

IDEのコード補完機能

ご覧のとおり、選択できるコンテキストメソッドは数十種類あり、それらは

String

タイプにのみ使用できます。このAPIのいくつかを詳しく調べて、いくつかの具体的な主張を見てみましょう。


__4.3. オブジェクトアサーション

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

2つのオブジェクトの同等性を比較できる2つの方法を見てみましょう。

次の2つの

Dog

オブジェクト

fido



fidosClone

があるとします。

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);

一方のオブジェクトの各フィールドは他方のオブジェクトのフィールドと比較されるため、フィールドごとに再帰的に比較する場合、

Fido



fidosClone

は等しくなります。

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

それらすべてを発見するためには、公式

AbstractObjectAssert


documentation

を参照してください。



4.4. Boolean

アサーション

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


  • isTrue()


  • isFalse()

実際に見てみましょう。

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


__4.5. 反復可能/配列アサーション


Iterable

または

Array

には、それらのコンテンツが存在することをアサートする方法が複数あります。最も一般的なアサーションの1つは、

Iterable

または

Array

に指定の要素が含まれているかどうかを確認することです。

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

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

または

List

が空ではない場合:

assertThat(list).isNotEmpty();

あるいは

List

が与えられた文字で始まる場合。例えば“ 1”:

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

同じオブジェクトに対して複数のアサーションを作成する場合は、それらを簡単に結合できます。

これは、提供されたリストが空ではなく、「1」要素を含み、ヌルを含まず、要素のシーケンス「2」、「3」を含むかどうかをチェックするアサーションの例です。

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

もちろん、これらのタイプにはもっと多くの可能なアサーションが存在します。それらすべてを発見するために、公式

AbstractIterableAssert


documentation

を参照してください。



4.6. 文字

アサーション

文字型のアサーションには、ほとんどの場合比較と、特定の文字が

Unicode

テーブルからのものであるかどうかのチェックが含まれます。

これは、提供された文字が「a」でなく、Unicode表にあり、「b」より大きく、小文字であるかどうかを確認するアサーションの例です。

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

すべての文字タイプのアサーションの詳細なリストについては、

AbstractCharacterAssert


document

を参照してください。


__4.7. クラスアサーション


Class

typeのアサーションは主にそのフィールド、

Class

types、アノテーションの有無、そしてクラスの最終性をチェックすることです。

あなたがクラス

Runnable

がインターフェースであることを主張したいならば、あなたは単に書く必要があります:

assertThat(Runnable.class).isInterface();

あるいは、あるクラスが他のクラスから割り当て可能かどうかを確認したい場合は、

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

考えられるすべての

Class

アサーションは、

AbstractClassAssert


文書

で表示できます。



4.8. ファイル

アサーション


File

アサーションは、指定された

File

インスタンスが存在するか、ディレクトリまたはファイルであるか、特定の内容を持つか、読み取り可能か、または指定された拡張子を持つかを確認することだけです。

ここでは、与えられたファイルが存在し、ディレクトリではなくファイルであるかどうかをチェックするアサーションの例を見ることができます。

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

可能性のあるすべてのクラスアサーションは、

AbstractFileAssert


文書

で表示できます。


__4.9. ダブル/フロート/整数アサーション


  • Double/Float/Integer

    およびその他の

    Number

    型**

数値アサーションは、与えられたオフセットの内外で数値を比較することに関するものです。たとえば、与えられた精度に従って2つの値が等しいかどうかを確認したい場合は、次のようにします。

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


Offset

オブジェクトを生成するために、既にインポートされた

withPrecision(Double offset)

ヘルパーメソッドを使用していることに注意してください。

より多くの主張については、AbstractDoubleAssert

documentation

をご覧ください。



4.10. InputStream

アサーション

利用可能な

InputStream

固有のアサーションは1つだけです。


  • hasSameContentAs(InputStreamが必要です)

そして実際には:

assertThat(given).hasSameContentAs(expected);



4.11. Map

アサーション


Map

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

また、ここでは、与えられたマップが空ではなく、数字キー「2」を含み、数字キー「10」を含まず、エントリ:

key:2、値:「a」

を含むかどうかをチェックするアサーションの例を見ることができます。

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

その他のアサーションについては、

AbstractMapAssert


documentation

を参照してください。



4.12. Throwable

アサーション

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

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

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

その他のアサーションについては、AbstractThrowableAssert

document

を参照してください。


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は、Java 8の関数型プログラミング機能を最大限に活用します。例を見てみましょう。まず、Java 7でこれを行う方法を見てみましょう。

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

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

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

この連載の今後の記事で、AssertJのJava8の機能を探ります。上記の例はAssertJのhttp://joel-costigliola.github.io/assertj/[website]からのものです。

7.

まとめ

この記事では、AssertJがコアJava型に対して最も人気のあるアサーションと一緒に私たちに与える可能性を簡単に探りました。

すべての例とコードスニペットの実装はhttps://github.com/eugenp/tutorials/tree/master/testing-modules/testing[GitHubプロジェクト]にあります。