根据我的理解,软断言适用于布尔值而不是异常。
另外:如果你在调用之前抛出异常softAssertions.assertAll()
,显然这个方法也永远不会被执行。这实际上是您报告的行为的原因。
只需尝试调试您的代码,您就会发现softAssertions.assertAll()
从未调用过。
如果您将代码更改为: 软断言将正常工作:
@Test
void soft_assertions() {
SoftAssertions softAssertions = new SoftAssertions();
softAssertions.assertThat(checkCondition(10)).isTrue();
softAssertions.assertThat(checkCondition(10)).isTrue();
softAssertions.assertThat(checkCondition(1)).isTrue();
softAssertions.assertThat(checkCondition(2)).isTrue();
softAssertions.assertThat(checkCondition(20)).isTrue();
softAssertions.assertAll();
}
private static boolean checkCondition(int stuff){
if(stuff == 1 || stuff == 2){
return false;
}
return true;
}
这将输出多个断言的结果,并且不会在评估第一个失败的断言时停止。
输出:
org.assertj.core.api.SoftAssertionError:
The following 2 assertions failed:
1)
Expecting:
<false>
to be equal to:
<true>
but was not.
at JsonStewardshipCustomerConversionTest.soft_assertions(JsonStewardshipCustomerConversionTest.java:301)
2)
Expecting:
<false>
to be equal to:
<true>
but was not.
at JsonStewardshipCustomerConversionTest.soft_assertions(JsonStewardshipCustomerConversionTest.java:302)
更新
SoftAssertion 似乎不符合您的目的。
我建议您改用 JUnit 5 assertAll
。根据我的测试,它评估了一个assertAll
块中的所有条件并且也能在异常中幸存下来。这里的问题是你需要 JUnit 5,它可能还没有被广泛采用。
这是一个布尔条件失败的示例,也是一个异常。两者都在控制台中报告。
@Test
void soft_assertions() {
assertAll("Check condition",
() -> assertThat(checkCondition(9)).isTrue(),
() -> assertThat(checkCondition(10)).isTrue(),
() -> assertThat(checkCondition(11)).isTrue(),
() -> assertThat(checkCondition(2)).isTrue(), // Throws exception
() -> assertThat(checkCondition(3)).isFalse(), // fails
() -> assertThrows(IllegalArgumentException.class, () -> {
checkCondition(1);
})
);
}
private static boolean checkCondition(int stuff) {
if (stuff == 1 || stuff == 2) {
throw new IllegalArgumentException();
}
return true;
}
您将在输出中看到:
org.opentest4j.MultipleFailuresError: Check condition (2 failures)
<no message> in java.lang.IllegalArgumentException
Expecting:
<true>
to be equal to:
<false>
but was not.