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

JUnit 4 および JUnit 5 でのアサーション

1.はじめに

この記事では、JUnit 内で使用できるアサーションについて詳しく説明します。

JUnit 4 から JUnit 5 への移行と JUnit 5 へのガイドの記事に続いて、JUnit 4 と JUnit 5 で利用可能なさまざまなアサーションについて詳しく説明します。

また、JUnit 5 でアサーションに加えられた機能強化についても取り上げます。

2.アサーション

アサーションは、テストでの条件のアサートをサポートするユーティリティ メソッドです;これらのメソッドは Assert からアクセスできます クラス、JUnit 4、および アサーション 1 つ、JUnit 5 で。

テストとアサーション自体の可読性を高めるために、インポート することを常にお勧めします。 静的にそれぞれのクラス。このようにして、表現するクラスをプレフィックスとして使用せずに、アサーション メソッド自体を直接参照できます。

JUnit 4 で利用可能なアサーションの探索を始めましょう。

3. JUnit 4 でのアサーション

このバージョンのライブラリでは、すべてのプリミティブ型、オブジェクトでアサーションを使用できます。 および配列 (プリミティブまたはオブジェクトのいずれか)。

アサーション内のパラメーターの順序は、期待値の後に実際の値が続きます。オプションで、最初のパラメータは String にすることができます 評価された条件のメッセージ出力を表すメッセージ。

assertThat の定義方法がわずかに異なるのは 1 つだけです。 アサーションですが、後で説明します。

assertEquals から始めましょう

3.1. assertEquals

assertEquals アサーションは、期待値と実際の値が等しいことを検証します:

@Test
public void whenAssertingEquality_thenEqual() {
    String expected = "Baeldung";
    String actual = "Baeldung";

    assertEquals(expected, actual);
}

アサーションが失敗したときに表示するメッセージを指定することもできます:

assertEquals("failure - strings are not equal", expected, actual);

3.2. assertArrayEquals

2 つの配列が等しいことをアサートしたい場合は、assertArrayEquals: を使用できます。

@Test
public void whenAssertingArraysEquality_thenEqual() {
    char[] expected = {'J','u','n','i','t'};
    char[] actual = "Junit".toCharArray();
    
    assertArrayEquals(expected, actual);
}

両方の配列が null の場合 、アサーションはそれらを等しいと見なします:

@Test
public void givenNullArrays_whenAssertingArraysEquality_thenEqual() {
    int[] expected = null;
    int[] actual = null;

    assertArrayEquals(expected, actual);
}

3.3. assertNotNull そして assertNull

オブジェクトが null かどうかをテストしたい場合 assertNull を使用できます アサーション:

@Test
public void whenAssertingNull_thenTrue() {
    Object car = null;
    
    assertNull("The car should be null", car);
}

逆に、オブジェクトが null であってはならないことをアサートしたい場合は、assertNotNull アサーション を使用できます。

3.4. assertNotSame そしてassertSame

assertNotSame を使用 、2 つの変数が同じオブジェクトを参照していないかどうかを確認できます:

@Test
public void whenAssertingNotSameObject_thenDifferent() {
    Object cat = new Object();
    Object dog = new Object();

    assertNotSame(cat, dog);
}

それ以外の場合、2 つの変数が同じオブジェクトを参照していることを確認したい場合は、assertSame を使用できます。

3.5. assertTrue および assertFalse

特定の条件が true であることを確認したい場合 または false 、それぞれ assertTrue を使用できます アサーションまたは assertFalse 1:

@Test
public void whenAssertingConditions_thenVerified() {
    assertTrue("5 is greater then 4", 5 > 4);
    assertFalse("5 is not greater then 6", 5 > 6);
}

3.6. 失敗

失敗 アサーションは AssertionFailedError をスローしてテストに失敗します .実際の例外がスローされたことを確認するため、または開発中にテストを失敗させたい場合に使用できます。

最初のシナリオでどのように使用できるか見てみましょう:

@Test
public void whenCheckingExceptionMessage_thenEqual() {
    try {
        methodThatShouldThrowException();
        fail("Exception not thrown");
    } catch (UnsupportedOperationException e) {
        assertEquals("Operation Not Supported", e.getMessage());
    }
}

3.7. assertThat

assertThat アサーションは、他のアサーションと比較してパラメーターの順序が逆になっている JUnit 4 の唯一のものです。

この場合、アサーションにはオプションの失敗メッセージ、実際の値、および Matcher があります。 オブジェクト。

このアサーションを使用して、配列に特定の値が含まれているかどうかを確認する方法を見てみましょう:

@Test
public void testAssertThatHasItems() {
    assertThat(
      Arrays.asList("Java", "Kotlin", "Scala"), 
      hasItems("Java", "Kotlin"));
}

assertThat の強力な使用に関する追加情報 Matcher によるアサーション オブジェクトは、Testing with Hamcrest で入手できます。

4. JUnit 5 アサーション

JUnit 5 は、JUnit 4 のアサーション メソッドの多くを保持しながら、Java 8 サポートを利用するいくつかの新しいアサーション メソッドを追加しました。

また、このバージョンのライブラリでは、すべてのプリミティブ型、オブジェクトでアサーションを使用できます。 および配列 (プリミティブまたはオブジェクトのいずれか)。

アサーションのパラメーターの順序が変更され、出力メッセージ パラメーターが最後のパラメーターとして移動されました。 Java 8 のサポートにより、出力メッセージを Supplier にすることができます。 、遅延評価を許可します。

すでに JUnit 4 に相当するものがあるアサーションのレビューを始めましょう。

4.1. assertArrayEquals

assertArrayEquals アサーションは、予想される配列と実際の配列が等しいことを検証します:

@Test
public void whenAssertingArraysEquality_thenEqual() {
    char[] expected = { 'J', 'u', 'p', 'i', 't', 'e', 'r' };
    char[] actual = "Jupiter".toCharArray();

    assertArrayEquals(expected, actual, "Arrays should be equal");
}

配列が等しくない場合、メッセージ「Arrays should be equal 」が出力として表示されます。

4.2. assertEquals

2 つの float をアサートしたい場合 等しい場合、単純な assertEquals を使用できます アサーション:

@Test
void whenAssertingEquality_thenEqual() {
    float square = 2 * 2;
    float rectangle = 2 * 2;

    assertEquals(square, rectangle);
}

ただし、実際の値が事前定義された差分だけ期待値と異なることをアサートしたい場合でも、assertEquals を使用できます。 ただし、デルタ値を 3 番目のパラメーターとして渡す必要があります:

@Test
void whenAssertingEqualityWithDelta_thenEqual() {
    float square = 2 * 2;
    float rectangle = 3 * 2;
    float delta = 2;

    assertEquals(square, rectangle, delta);
}

4.3. assertTrue および assertFalse

assertTrue を使用 アサーション、提供された条件が true であることを確認できます :

@Test
void whenAssertingConditions_thenVerified() {
    assertTrue(5 > 4, "5 is greater the 4");
    assertTrue(null == null, "null is equal to null");
}

ラムダ式のサポートにより、BooleanSupplier を提供できます ブール値の代わりにアサーションに

BooleanSupplier の正しさを主張する方法を見てみましょう assertFalse の使用 アサーション:

@Test
public void givenBooleanSupplier_whenAssertingCondition_thenVerified() {
    BooleanSupplier condition = () -> 5 > 6;

    assertFalse(condition, "5 is not greater then 6");
}

4.4. assertNull assertNotNull

オブジェクトが null ではないことをアサートしたい場合 assertNotNull を使用できます アサーション:

@Test
void whenAssertingNotNull_thenTrue() {
    Object dog = new Object();

    assertNotNull(dog, () -> "The dog should not be null");
}

逆に、assertNull を使用できます。 実際の値が null かどうかを確認するアサーション :

@Test
public void whenAssertingNull_thenTrue() {
    Object cat = null;

    assertNull(cat, () -> "The cat should be null");
}

どちらの場合も、Supplier であるため、失敗メッセージは遅延して取得されます。 .

4.5. assertSame そしてassertNotSame

期待されるものと実際のものが同じ Object を参照していると断言したいとき 、assertSame を使用する必要があります アサーション:

@Test
void whenAssertingSameObject_thenSuccessfull() {
    String language = "Java";
    Optional<String> optional = Optional.of(language);

    assertSame(language, optional.get());
}

逆に、assertNotSame を使用できます。

4.6. 失敗

失敗 アサーションは、提供された失敗メッセージと根本的な原因でテストに失敗します。これは、開発段階でまだ完了していないテストをマークするのに役立ちます:

@Test
public void whenFailingATest_thenFailed() {
    // Test not completed
    fail("FAIL - test not completed");
}

4.7. assertAll

JUnit 5 で導入された新しいアサーションの 1 つは、assertAll です。 .

このアサーションにより、すべてのアサーションが実行され、それらの失敗が一緒に報告される、グループ化されたアサーションの作成が可能になります。詳細には、このアサーションは、MultipleFailureError のメッセージ文字列に含まれる見出しを受け入れます 、およびストリーム 実行可能ファイル

グループ化されたアサーションを定義しましょう:

@Test
void givenMultipleAssertion_whenAssertingAll_thenOK() {
    Object obj = null;
    assertAll(
      "heading",
      () -> assertEquals(4, 2 * 2, "4 is 2 times 2"),
      () -> assertEquals("java", "JAVA".toLowerCase()),
      () -> assertNull(obj, "obj is null")
    );
}

グループ化されたアサーションの実行は、実行可能ファイルの 1 つがブラックリストに登録された例外 (OutOfMemoryError) をスローした場合にのみ中断されます。 例)

4.8. assertIterableEquals

assertIterableEquals 予想される iterable と実際の iterable が非常に等しいと主張します。

等しいためには、両方の iterable が同じ要素を同じ順序で返す必要があり、2 つの iterable が等しいために同じ型である必要はありません。

このことを考慮して、異なるタイプの 2 つのリスト (LinkedList および ArrayList 例) 等しい:

@Test
void givenTwoLists_whenAssertingIterables_thenEquals() {
    Iterable<String> al = new ArrayList<>(asList("Java", "Junit", "Test"));
    Iterable<String> ll = new LinkedList<>(asList("Java", "Junit", "Test"));

    assertIterableEquals(al, ll);
}

assertArrayEquals と同じ方法で 、両方の iterable が null の場合、それらは等しいと見なされます。

4.9. assertLinesMatch

assertLinesMatch String の予期されるリストが 実際のリストと一致します。

このメソッドは、assertEquals とは異なります そしてassertIterableEquals 予想される行と実際の行の各ペアに対して、次のアルゴリズムを実行するため:

<オール>
  • 予想される行が実際の行と等しいかどうかを確認します。はいの場合、次のペアに進みます
  • 期待される行を正規表現として扱い、String でチェックを実行します .matches() 方法。はいの場合、次のペアに進みます
  • 予想される行が早送りマーカーかどうかを確認します。はいの場合、早送りを適用し、手順 1 からアルゴリズムを繰り返します
  • このアサーションを使用して、String の 2 つのリストをアサートする方法を見てみましょう。 一致する行があります:

    @Test
    void whenAssertingEqualityListOfStrings_thenEqual() {
        List<String> expected = asList("Java", "\\d+", "JUnit");
        List<String> actual = asList("Java", "11", "JUnit");
    
        assertLinesMatch(expected, actual);
    }

    4.10. assertNotEquals

    assertEquals を補完 、assertNotEquals アサーションは、期待値と実際の値が等しくないことをアサートします:

    @Test
    void whenAssertingEquality_thenNotEqual() {
        Integer value = 5; // result of an algorithm
        
        assertNotEquals(0, value, "The result cannot be 0");
    }

    両方が null の場合 、アサーションは失敗します。

    4.11. assertThrows

    シンプルさと読みやすさを向上させるために、新しい assertThrows アサーションにより、実行可能ファイルが指定された例外タイプをスローするかどうかをアサートする明確で簡単な方法が可能になります。

    スローされた例外をアサートする方法を見てみましょう:

    @Test
    void whenAssertingException_thenThrown() {
        Throwable exception = assertThrows(
          IllegalArgumentException.class, 
          () -> {
              throw new IllegalArgumentException("Exception message");
          }
        );
        assertEquals("Exception message", exception.getMessage());
    }

    例外がスローされない場合、または異なるタイプの例外がスローされた場合、アサーションは失敗します。

    4.12. assertTimeout および assertTimeoutPreemptively

    提供された Executable の実行をアサートしたい場合 指定されたタイムアウトの前に終了します 、assertTimeout を使用できます アサーション:

    @Test
    void whenAssertingTimeout_thenNotExceeded() {
        assertTimeout(
          ofSeconds(2), 
          () -> {
            // code that requires less than 2 minutes to execute
            Thread.sleep(1000);
          }
        );
    }

    ただし、assertTimeout アサーション、提供された実行可能ファイルは、呼び出し元のコードの同じスレッドで実行されます。したがって、タイムアウトを超えた場合でも、サプライヤーの実行は事前に中止されません。

    タイムアウトを超えると実行可能ファイルの実行が中止されることを確認したい場合は、assertTimeoutPreemptively を使用できます。

    両方のアサーションは、実行可能ファイルの代わりに受け入れることができます ThrowingSupplier オブジェクトを返し、Throwable をスローする可能性があるコードの汎用ブロックを表します。

    5.結論

    このチュートリアルでは、JUnit 4 と JUnit 5 の両方で利用可能なすべてのアサーションについて説明しました。

    新しいアサーションの導入とラムダのサポートにより、JUnit 5 で行われた改善点を簡単に説明しました。

    いつものように、この記事の完全なソース コードは GitHub で入手できます。


    Java タグ