1. 概要

この記事は、 AssertJ Guava関連のアサーションに焦点を当てており、AssertJシリーズの2番目の記事です。 AssertJに関する一般的な情報が必要な場合は、シリーズ Introduction toAssertJの最初の記事を参照してください。

2. Mavenの依存関係

GuavaでAssertJを使用するには、pom.xmlに次の依存関係を追加する必要があります。

<dependency>
    <groupId>org.assertj</groupId>
    <artifactId>assertj-guava</artifactId>
    <version>3.0.0</version>
    <scope>test</scope>
</dependency>

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

また、バージョン3.0.0以降、 AssertJGuavaJava8およびAssertJCore3.xに依存していることに注意してください。

3. 動作中のグアバアサーション

AssertJ には、Guavaタイプのカスタムアサーションがあります: ByteSource Multimap Optional Range RangeMap およびテーブル

3.1. ByteSourceアサーション

2つの空の一時ファイルを作成することから始めましょう。

File temp1 = File.createTempFile("bael", "dung1");
File temp2 = File.createTempFile("bael", "dung2");

そしてそれらからByteSourceインスタンスを作成します:

ByteSource byteSource1 = Files.asByteSource(temp1);
ByteSource byteSource2 = Files.asByteSource(temp2);

これで、次のアサーションを記述できます。

assertThat(buteSource1)
  .hasSize(0)
  .hasSameContentAs(byteSource2);

3.2. マルチマップアサーション

Multimap は、特定のキーに複数の値を関連付けることができるマップです。 Multimap アサーションは、通常のMap実装とほとんど同じように機能します。

Multimap インスタンスを作成し、いくつかのエントリを追加することから始めましょう。

Multimap<Integer, String> mmap = Multimaps
  .newMultimap(new HashMap<>(), Sets::newHashSet);
mmap.put(1, "one");
mmap.put(1, "1");

そして今、私たちは主張することができます:

assertThat(mmap)
  .hasSize(2)
  .containsKeys(1)
  .contains(entry(1, "one"))
  .contains(entry(1, "1"));

また、2つの追加のアサーションが利用可能です–それらの間には微妙な違いがあります。

  • containsAllEntriesOfおよび
  • hasSameEntriesAs。

これらの2つのアサーションを見てみましょう。 まず、いくつかのマップを定義します。

Multimap<Integer, String> mmap1 = ArrayListMultimap.create();
mmap1.put(1, "one");
mmap1.put(1, "1");
mmap1.put(2, "two");
mmap1.put(2, "2");

Multimap<Integer, String> mmap1_clone = Multimaps
  .newSetMultimap(new HashMap<>(), HashSet::new);
mmap1_clone.put(1, "one");
mmap1_clone.put(1, "1");
mmap1_clone.put(2, "two");
mmap1_clone.put(2, "2");

Multimap<Integer, String> mmap2 = Multimaps
  .newSetMultimap(new HashMap<>(), HashSet::new);
mmap2.put(1, "one");
mmap2.put(1, "1");

ご覧のとおり、mmap1mmap1_cloneにはまったく同じエントリが含まれていますが、2つの異なるMapタイプの2つの異なるオブジェクトです。 Map mmap2 には、すべてのマップ間で共有される単一のエントリが含まれています。 これで、次のアサーションが当てはまります。

assertThat(mmap1)
  .containsAllEntriesOf(mmap2)
  .containsAllEntriesOf(mmap1_clone)
  .hasSameEntriesAs(mmap1_clone);

3.3. オプションアサーション

GuavaのOptionalのアサーションには、値の存在チェックと内部値を抽出するためのユーティリティが含まれます。

オプションインスタンスを作成することから始めましょう。

Optional<String> something = Optional.of("something");

これで、値の存在を確認し、オプションのコンテンツをアサートできます。

assertThat(something)
  .isPresent()
  .extractingValue()
  .isEqualTo("something");

3.4. 範囲アサーション

GuavaのRangeクラスのアサーションには、 Range の下限と上限、または特定の値が特定の範囲内にあるかどうかのチェックが含まれます。

次のようにして、文字の単純な範囲を定義しましょう。

Range<String> range = Range.openClosed("a", "g");

そして今、私たちはテストすることができます:

assertThat(range)
  .hasOpenedLowerBound()
  .isNotEmpty()
  .hasClosedUpperBound()
  .contains("b");

3.5. テーブルアサーション

AssertJのテーブル固有のアサーションにより、行と列の数、およびセル値の存在を確認できます。

単純なTableインスタンスを作成しましょう。

Table<Integer, String, String> table = HashBasedTable.create(2, 2);
table.put(1, "A", "PRESENT");
table.put(1, "B", "ABSENT");

これで、次のチェックを実行できます。

assertThat(table)
  .hasRowCount(1)
  .containsValues("ABSENT")
  .containsCell(1, "B", "ABSENT");

4. 結論

AssertJシリーズのこの記事では、Guavaに関連するすべての機能について説明しました。

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