代码如下所示。我希望它去测试 keyNames 的所有元素。 但是,如果任何测试失败,它就会停止,并且不会迭代所有数组元素。 我的理解是,在assertAll中,所有断言都会被执行,任何失败都应该一起报告。
private void validateData(SearchHit searchResult, String [] line){
for(Integer key : keyNames){
String expectedValue = getExpectedValue(line, key);
String elementName = mappingProperties.getProperty(key.toString());
if (elementName != null && elementName.contains(HEADER)){
assertAll(
() -> assumingThat((expectedValue != null && expectedValue.length() > 0),
() -> {
String actualValue = testHelper.getHeaderData(searchResult, elementName);
if(expectedValue != null) {
assertEquals(expectedValue, actualValue, " ###Element Name -> " + elementName +" : Excepted Value ### " + expectedValue + " ### Actual Value ###" + actualValue);
}
}
)
);
}
}
}
Assertions.assertAll()
的javadoc声明:
断言所有提供的可执行文件不会抛出异常。
实际上,您在每次迭代时都在
Executable
中提供了一个 assertAll()
。事实上,您通过每次最多请求一个断言来调用多次
assertAll()
:
if(expectedValue != null) {
assertEquals(expectedValue, actualValue, " ###Element Name -> " + elementName +" : Excepted Value ### " + expectedValue + " ### Actual Value ###" + actualValue);
}
您想要做的是相反的操作:通过传递多个执行所需断言的
assertAll()
实例来调用 Executable
。
因此,您可以使用经典循环将它们收集在
List
中,并以这种方式传递:
assertAll(list.stream())
或创建一个Stream<Executable>
而不进行任何收集并直接传递它,例如assertAll(stream)
。
这是一个带有 Stream 的版本(根本没有测试过),但你应该明白了:
Stream<Executable> executables =
keyNames.stream()
.map(key->
// create an executable for each value of the streamed list
()-> {
String expectedValue = getExpectedValue(line, key);
String elementName = mappingProperties.getProperty(key.toString());
if (elementName != null && elementName.contains(HEADER)){
assumingThat((expectedValue != null && expectedValue.length() > 0),
() -> {
String actualValue = testHelper.getHeaderData(searchResult, elementName);
if(expectedValue != null) {
assertEquals(expectedValue, actualValue, " ###Element Name -> " + elementName +" : Excepted Value ### " + expectedValue + " ### Actual Value ###" + actualValue);
}
}
);
}
}
);
Assertions.assertAll(executables);
assertAll()
将传递给 assertAll()
调用的所有断言和错误分组。它不会对测试方法期间发生的所有调用进行分组断言。
在您发布的代码中,您将单个断言 lambda 传递到
assertAll()
。它不会对多个键上的错误进行分组,因为每个 key
都有一个单独的 assertAll()
调用。
为了确保单独测试集合中的所有值,请查看参数化测试。
如@user31601所示,参数化测试(参见文档)会自动独立测试所有案例。
这导致了以下(稍微简单一些)代码):
@ParameterizedTest
@MethodSource("getKeys")
void testKey(String key) {
String elementName = mappingProperties.getProperty(key.toString());
assumeTrue(elementName != null);
assumeTrue(elementName.contains(HEADER));
String expectedValue = getExpectedValue(line, key);
assumeTrue(expectedValue != null);
assumeTrue(expectedValue.length() > 0);
String actualValue = testHelper.getHeaderData(searchResult, elementName);
String doc = String.format("name: %s, expected %s, actual %s", elementName, expectedValue, actualValue);
assertEquals(expectedValue, actualValue, doc);
}
private static Stream<String> getKeys() {
return keyNames.stream()
}