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

AssertJの紹介

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

1.概要

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

この記事では、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 を使用する必要があることに注意してください。

最新バージョンはここにあります。

3.はじめに

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

  • 標準 Java
  • Java 8
  • グアバ
  • ジョーダ タイム
  • Neo4J と
  • Swing コンポーネント

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

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 の動作

このセクションでは、AssertJ のセットアップとその可能性の探索に焦点を当てます。

4.1.はじめに

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

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

4.2.アサーションの記述

アサーションを記述するには、オブジェクトを Assertions.assertThat() に渡すことから始める必要があります。 メソッドを呼び出してから、実際のアサーションに従います。

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

assertThat(anyRefenceOrValue);

IDE のコード補完機能を活用すれば、AssertJ アサーションの記述は、その非常に記述的なメソッドにより信じられないほど簡単になります。 IntelliJ IDEA 16 では次のようになります。

IDE のコード補完機能

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

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

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

2 つのオブジェクトの等価性を比較する 2 つの方法を見てみましょう。次の 2 つの があるとします。 オブジェクト フィド および 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);

ファイド および fidosClone 1 つのオブジェクトの各フィールドが他のオブジェクトのフィールドと比較されるため、再帰的なフィールドごとの比較を行う場合は等しいです。

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

4.4.ブール値 アサーション

真実をテストするためのいくつかの簡単な方法があります:

  • isTrue()
  • isFalse()

それらを実際に見てみましょう:

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

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

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

List<String> 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");

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

4.6.文字 アサーション

文字タイプのアサーションには、主に比較が含まれ、指定された文字が Unicode からのものであるかどうかのチェックも含まれます

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

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

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

4.7.クラス アサーション

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

そのクラスをアサートしたい場合 Runnable はインターフェイスです。単純に次のように記述する必要があります:

assertThat(Runnable.class).isInterface();

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

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

可能なすべてのクラス アサーションは AbstractClassAssert で表示できます ドキュメンテーション。

4.8.ファイル アサーション

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

ここでは、特定のファイルが存在するかどうか、ディレクトリではなくファイルであるかどうか、読み書き可能かどうかを確認するアサーションの例を示します:

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

すべての可能なクラス アサーションは AbstractFileAssert で表示できます ドキュメンテーション。

4.9.倍精度/浮動小数点/整数 アサーション

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

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

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

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

その他のアサーションについては、AbstractDoubleAssert のドキュメントを参照してください。

4.10.入力ストリーム アサーション

InputStream は 1 つだけです -特定のアサーションが利用可能:

  • hasSameContentAs(InputStream が必要)

実際の動作:

assertThat(given).hasSameContentAs(expected);

4.11.地図 アサーション

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

ここでは、特定のマップが空ではないこと、数値キー「2」が含まれていること、数値キー「10」が含まれていないこと、およびエントリ:キー:2、値:「a」が含まれているかどうかを確認するアサーションの例を確認できます。 」 :

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

その他のアサーションについては、AbstractMapAssert を参照してください。 ドキュメンテーション。

4.12.投げられる アサーション

投擲可能 アサーションにより、たとえば、例外のメッセージ、スタック トレースの検査、原因のチェック、または例外が既にスローされているかどうかの検証が可能になります。

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

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

その他のアサーションについては、AbstractThrowableAssert のドキュメントを参照してください。

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 レースでコレクションをフィルタリングしています。Java 8 では、次のようなことができます。

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

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

7. 結論

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

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

次の » Guava の AssertJ
Java タグ