首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JUnit5 assertAll

JUnit5 assertAll
EN

Stack Overflow用户
提问于 2018-07-12 14:32:15
回答 3查看 4K关注 0票数 2

代码如下所示。我想让它去测试keyNames的所有元素。但是,如果任何测试失败,并且没有迭代所有数组元素,它就会停止。我的理解是,在assertAll中,所有断言都被执行,任何失败都应该一起报告。

谢谢你的时间和帮助。

代码语言:javascript
复制
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);
                                        }
                                      }
                                 )
                );

            }

        }
    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-07-12 14:44:20

Assertions.assertAll()的javadoc声明:

断言所有提供的可执行文件都不会引发异常。

实际上,您在每次迭代时都在assertAll()中提供了一个单独的assertAll()

因此,循环中任何迭代中的失败都会终止测试执行。

实际上,您每次最多只请求一个断言,从而多次调用assertAll()

代码语言:javascript
复制
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的版本(根本没有测试),但是您应该有这样的想法:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-07-12 15:04:52

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

在您发布的代码中,您将一个断言lambda传递到assertAll()中。它不会对多个键的错误进行分组,因为每个key都有一个单独的assertAll()调用。

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

票数 1
EN

Stack Overflow用户

发布于 2018-07-17 06:59:24

正如@user31601所指出的,参数化测试(参见文档)会自动独立测试所有情况。

这导致了以下(稍微简单一些的)代码:

代码语言:javascript
复制
@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()
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51308316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档