1. ホーム
  2. java

[解決済み] JUnit5 の assertAll と複数アサーションの比較

2023-05-21 07:10:28

疑問点

複数のアサーションをグループ化する理由はあるのでしょうか。

public void shouldTellIfPrime(){
    Assertions.assertAll(
            () -> assertTrue(isPrime(2)),
            () -> assertFalse(isPrime(4))
    );
}

とするのではなく、このように

public void shouldTellIfPrime(){
    Assertions.assertTrue(isPrime(2));
    Assertions.assertFalse(isPrime(4));
}

どのように解決するのですか?

の面白いところは assertAll は、それが は常に渡されたすべてのアサーションをチェックします。 に渡されたアサーションをすべてチェックし、いくつ失敗しても構わないということです。もしすべてがパスすれば、すべてがうまくいきます。もし少なくとも 1 つが失敗すれば、うまくいかなかったこと (そしてその点に関しては正しかったこと) についての詳細な結果が表示されます。

これは、概念的に一緒になっている一連のプロパティを表明するために最もよく使われます。最初の直感は、「私はこれを1つとして主張したい」です。

あなたの具体的な例は assertAll なぜなら isPrime を素数と非素数でチェックすることは互いに独立しているからです。そのため、そのためのテストメソッドを2つ書くことをお勧めします。

しかし、住所のような単純なクラスで、フィールド city , street , number であり、それらはあなたが期待するものであると断言したい。

Address address = unitUnderTest.methodUnderTest();
assertEquals("Redwood Shores", address.getCity());
assertEquals("Oracle Parkway", address.getStreet());
assertEquals("500", address.getNumber());

さて、最初のアサーションが失敗するとすぐに、2番目のアサーションの結果を見ることができなくなり、非常に困ることがあります。これを回避する方法はたくさんあり、JUnit Jupiterの assertAll はその一つです。

Address address = unitUnderTest.methodUnderTest();
assertAll("Should return address of Oracle's headquarter",
    () -> assertEquals("Redwood Shores", address.getCity()),
    () -> assertEquals("Oracle Parkway", address.getStreet()),
    () -> assertEquals("500", address.getNumber())
);

テスト対象のメソッドが間違ったアドレスを返した場合、このようなエラーになります。

org.opentest4j.MultipleFailuresError:
    Should return address of Oracle's headquarter (3 failures)
    expected: <Redwood Shores> but was: <Walldorf>
    expected: <Oracle Parkway> but was: <Dietmar-Hopp-Allee>
    expected: <500> but was: <16>