assertAll与JUnit5中的多个Assert

4szc88ey  于 2022-11-24  发布在  其他
关注(0)|答案(3)|浏览(198)

是否有任何理由将多个Assert分组:

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

而不是这样做:

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

5hcedyr01#

assertAll的有趣之处在于,它总是检查所有传递给它的Assert,不管有多少个失败。如果所有的Assert都通过了,那么所有的Assert都很好--如果至少有一个失败了,你会得到所有错误的详细结果(以及正确的结果)。
它最好用来Assert一组在概念上属于一起的属性。一些你的第一本能会是,“我想Assert这是一个”的东西。

示例

您的具体示例并不是assertAll的最佳用例,因为检查带素数和非素数的isPrime是相互独立的--如此之多,以至于我建议为此编写两种测试方法。
但是假设你有一个简单的类,比如一个地址,它有字段citystreetnumber,并且你想Assert它们是你所期望的:

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

现在,一旦第一个Assert失败,您将永远看不到第二个Assert的结果,这可能会非常烦人。有很多方法可以解决这个问题,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>
pu3pd22g

pu3pd22g2#

根据这里的文件
Assert所有提供的可执行文件都不会引发AssertionError。
如果任何提供的可可执行掷回AssertionError,则仍会执行所有剩馀的可可执行,而且会汇总所有失败,并在MultipleFailuresError中报告。不过,如果可可执行掷回不是AssertionError的例外状况,则会立即停止执行,而且会依原样重新掷回例外状况,但会遮罩为未经检查的例外状况。
因此,主要区别在于 assertAll 将允许执行所有Assert,而不会中断流程,而其他如 assertTrue 和批次将停止测试,并出现 AssertionError
因此,在第一个示例中,两个Assert都将执行,而不管通过还是失败,而在第二个示例中,如果第一个Assert失败,测试将停止。
是否有任何理由对多个Assert进行分组
如果您要在公寓测试中执行所有判断提示。

2izufjch

2izufjch3#

assertassertAll,这两种方法均设计用于验证预期输出与实际输出。
在简单的assert中,如果第一个Assert失败,则整个测试用例失败,并且不验证其余Assert。assertAll验证所有测试用例。
如果某些Assert失败,则它还将继续其余Assert,并返回所有失败Assert的验证结果。
例如:

public Apple addApple(int appleId, String appleName) {
    Apple apple = new Apple(appleId, appleName);
    return apple;
}

测试用例:

@Test
void addAppleAssertTest() {
    System.out.println("AppleCalculatorTest.addAppleTest");
    AppleCalculator appleCalculator = new AppleCalculator();
    Apple apple = appleCalculator.addApple(1, "apple");
    assertNotNull(apple, "apple object should not be null");
    assertEquals(11, apple.getAppleId(), "appleId should be 1");
    assertEquals("apple1", apple.getAppleName(), "appleName should be apple");
}
    
@Test
void addAppleAssertAllTest() {
    System.out.println("AppleCalculatorTest.addAppleTest");
    AppleCalculator appleCalculator = new AppleCalculator();
    Apple apple = appleCalculator.addApple(1, "apple");
    assertAll(() -> assertNotNull(apple, "apple object should not be null"),
        () -> assertEquals(11, apple.getAppleId(), "appleId should be 1"),
        () -> assertEquals("apple1", apple.getAppleName(), "appleName should be apple"));
}

相关问题