JUnit5断言All

问题描述 投票:0回答:3

代码如下所示。我希望它去测试 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);
                                    }
                                  }
                             )
            );
        }
    }
}
java junit5
3个回答
3
投票

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);

2
投票

assertAll()
将传递给
assertAll()
调用的所有断言和错误分组。它不会对测试方法期间发生的所有调用进行分组断言。

在您发布的代码中,您将单个断言 lambda 传递到

assertAll()
。它不会对多个键上的错误进行分组,因为每个
key
都有一个单独的
assertAll()
调用。

为了确保单独测试集合中的所有值,请查看参数化测试


2
投票

如@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()
}
© www.soinside.com 2019 - 2024. All rights reserved.