在 JUnit 或其他 Java 包中使用 Expect 与 Assert

use*_*336 4 java junit

我是一个 C++-er 做一些 Java。在 C++ 广泛使用的gtest包中,Expectations 和 Assertions 之间存在区别:

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

如果测试失败,断言将停止测试。期望不会停止测试。如果未满足预期,则测试将失败。不同之处在于,我们可以在一次测试运行中看到代码块中有多少未满足预期。

这在 Java 中有等价的吗?我目前正在使用 JUnit,并且看到到处都在使用断言:

Assert.assertEquals(4, 2); // just like C++, this stops the show
Run Code Online (Sandbox Code Playgroud)

这很好,但问题是你看不到在一次测试运行中有多少失败!!

nic*_*ckb 6

对于 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")));
    }
}
Run Code Online (Sandbox Code Playgroud)

你会得到两个失败的报告:

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

java.lang.AssertionError: 
Expected: is "bar"
     but: was "foo"
Run Code Online (Sandbox Code Playgroud)


mic*_*alk 5

使用 JUnit 5,您可以使用assertAll方法并传递您的断言。将调用所有断言,在第一个失败的断言后测试不会停止:

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

消息将是:

Multiple Failures (2 failures)
    expected: <4> but was: <2>
    expected: <5> but was: <2>
Run Code Online (Sandbox Code Playgroud)