是否有任何理由将多个Assert分组:
public void shouldTellIfPrime(){
Assertions.assertAll(
() -> assertTrue(isPrime(2)),
() -> assertFalse(isPrime(4))
);
}
而不是这样做:
public void shouldTellIfPrime(){
Assertions.assertTrue(isPrime(2));
Assertions.assertFalse(isPrime(4));
}
3条答案
按热度按时间5hcedyr01#
assertAll
的有趣之处在于,它总是检查所有传递给它的Assert,不管有多少个失败。如果所有的Assert都通过了,那么所有的Assert都很好--如果至少有一个失败了,你会得到所有错误的详细结果(以及正确的结果)。它最好用来Assert一组在概念上属于一起的属性。一些你的第一本能会是,“我想Assert这是一个”的东西。
示例
您的具体示例并不是
assertAll
的最佳用例,因为检查带素数和非素数的isPrime
是相互独立的--如此之多,以至于我建议为此编写两种测试方法。但是假设你有一个简单的类,比如一个地址,它有字段
city
、street
、number
,并且你想Assert它们是你所期望的:现在,一旦第一个Assert失败,您将永远看不到第二个Assert的结果,这可能会非常烦人。有很多方法可以解决这个问题,JUnit Jupiter的
assertAll
就是其中之一:如果测试中的方法返回错误的地址,则会出现以下错误:
pu3pd22g2#
根据这里的文件
Assert所有提供的可执行文件都不会引发AssertionError。
如果任何提供的可可执行掷回AssertionError,则仍会执行所有剩馀的可可执行,而且会汇总所有失败,并在MultipleFailuresError中报告。不过,如果可可执行掷回不是AssertionError的例外状况,则会立即停止执行,而且会依原样重新掷回例外状况,但会遮罩为未经检查的例外状况。
因此,主要区别在于 assertAll 将允许执行所有Assert,而不会中断流程,而其他如 assertTrue 和批次将停止测试,并出现 AssertionError
因此,在第一个示例中,两个Assert都将执行,而不管通过还是失败,而在第二个示例中,如果第一个Assert失败,测试将停止。
是否有任何理由对多个Assert进行分组
如果您要在公寓测试中执行所有判断提示。
2izufjch3#
assert
和assertAll
,这两种方法均设计用于验证预期输出与实际输出。在简单的
assert
中,如果第一个Assert失败,则整个测试用例失败,并且不验证其余Assert。assertAll
验证所有测试用例。如果某些Assert失败,则它还将继续其余Assert,并返回所有失败Assert的验证结果。
例如:
测试用例: