Expect vs Assert в JUnit или другом Java пакете - PullRequest
4 голосов
/ 26 мая 2020

Я C ++ - эр, делаю немного Java. В широко используемом пакете gtest C ++ существует различие между ожиданиями и утверждениями:

 EXPECT_EQ(4, 2); // will ultimately cause test failure but test continues to run
 ASSERT_EQ(4, 2); // test will stop here and fail

Assert остановит тест, если он не прошел. Ожидание не остановит испытание. Если ожидания не оправдаются, тест не состоится. Разница в том, что мы можем увидеть, сколько ожиданий не выполняется в блоке кода всего за один тестовый прогон.

Имеет ли это эквивалент в Java? В настоящее время я использую JUnit и вижу, что Asserts используются повсюду:

Assert.assertEquals(4, 2); // just like C++, this stops the show

Это здорово, но проблема в том, что вы не можете увидеть, сколько сбоев у вас произошло за один тестовый запуск !!

Ответы [ 2 ]

6 голосов
/ 26 мая 2020

Для JUnit 4 вы можете использовать JUnit ErrorCollector, например:

public class TestClass {
    @Rule
    public ErrorCollector collector = new ErrorCollector();

    @Test
    public void test() {
        collector.checkThat(4, is(equalTo(5)));
        collector.checkThat("foo" , is(equalTo("bar")));
    }
}

Вы получите сообщение об обоих сбоях:

java.lang.AssertionError: 
Expected: is <5>
     but: was <4>

java.lang.AssertionError: 
Expected: is "bar"
     but: was "foo"
5 голосов
/ 26 мая 2020

Используя JUnit 5, вы можете использовать метод assertAll и передавать свои утверждения. Все утверждения будут вызваны, тест не остановится после первого неудачного утверждения:

@Test
void test() {
    Executable assertion1 = ()  -> Assertions.assertEquals(4, 2);
    Executable assertion2 = ()  -> Assertions.assertEquals(5, 2);
    Assertions.assertAll(assertion1, assertion2);
}

, и сообщение будет:

Multiple Failures (2 failures)
    expected: <4> but was: <2>
    expected: <5> but was: <2>
...