assertAll
的有趣之处在于,它会始终检查传递给它的所有断言,无论有多少个失败。如果全部通过,一切都好;如果至少有一个失败,则会得到所有错误(以及正确)的详细结果。
它最适合用于断言概念上归为一组的一组属性。例如,你的第一反应是:“我想把这个作为一个整体进行断言”。
示例
对于检查是否为质数和非质数,您的具体示例不是 assertAll
的最佳用例,因为它们互相独立 - 以至于我建议为此编写两个测试方法。
但是假设您有一个简单的类,例如带有字段 city
、street
、number
的地址,并且想要断言它们的值是否符合预期:
Address address = unitUnderTest.methodUnderTest();
assertEquals("Redwood Shores", address.getCity());
assertEquals("Oracle Parkway", address.getStreet());
assertEquals("500", address.getNumber());
现在,一旦第一个断言失败,您将永远看不到第二个断言的结果,这可能非常令人恼火。有许多方法可以解决这个问题,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>
Address:equals
测试了这些属性,因此我可以用一个断言来验证它们。从逻辑上讲,根本没有任何区别,但突然之间它就成了“只有一个assert”。如果我费力地为类创建一个Hamcrest匹配器,情况也是如此。 - Nicolai Parlog