assertAll против нескольких утверждений в JUnit5
есть ли причина группировать несколько утверждений:
public void shouldTellIfPrime(){
Assertions.assertAll(
() -> assertTrue(isPrime(2)),
() -> assertFalse(isPrime(4))
);
}
вместо этого:
public void shouldTellIfPrime(){
Assertions.assertTrue(isPrime(2));
Assertions.assertFalse(isPrime(4));
}
2 ответов
самое интересное о assertAll
что это всегда проверяет все утверждения, которые передаются ему, независимо от того, сколько удастся. Если все пройдет, все в порядке - если хотя бы один провалится, вы получите подробный результат всего, что пошло не так (и правильно, если на то пошло).
лучше всего использовать для утверждения набора свойств, которые принадлежат друг другу концептуально. Что-то, где ваш первый инстинкт будет: "я хочу утверждать это как один."
пример
ваш конкретный пример не является оптимальным вариантом использования для assertAll
потому что проверка isPrime
С простым и не-простым не зависит друг от друга-настолько, что я бы рекомендовал написать два метода тестирования для этого.
но предположим, что у вас есть простой класс, такой как адрес с полями city
, street
, number
и хотел бы утверждать, что это то, что вы ожидаете от них:
Address address = unitUnderTest.methodUnderTest();
assertEquals("Redwood Shores", address.getCity());
assertEquals("Oracle Parkway", address.getStreet());
assertEquals("500", address.getNumber());
теперь, как только первое утверждение терпит неудачу, вы никогда не увидите результатов второго, что может быть довольно раздражающим. Есть много способов обойти это и JUnit Юпитера 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>
согласно документации здесь
утверждает, что все поставляемые исполняемые файлы не вызывают AssertionError.
Если любой поставляемый исполняемый отправляет AssertionError, все остальные исполняемые файлы по-прежнему будут выполняться, и все сбои будут агрегируется и сообщается в MultipleFailuresError. Однако, если исполняемый файл создает исключение, которое не является AssertionError, выполнение будет немедленно остановлено, и исключение быть переосмысленным как маскируется как непроверенное исключение.
Итак, основное различие заключается в том, что assertAll позволит всем утверждениям выполнять, не нарушая поток, в то время как другие, как assertTrue и лот остановит тест с AssertionError
таким образом, в первом примере оба утверждения будут выполняться независимо от pass to fail, а во втором примере тест остановится, если первое утверждение неудачи.
есть ли причина группировать несколько утверждений
Если вы хотите, чтобы все утверждения осуществляется в модульном тесте.