23

我有一堆@ParameterizedTest从 a 接收参数的 s@MethodSource具有非常详细toString()的结果(例如 Selenium's WebDriver)。这些默认情况下用于组成相应的显示名称。从JUnit 5 用户指南

默认情况下,参数化测试调用的显示名称包含调用索引和该特定调用的所有参数的字符串表示形式。但是,您可以通过注释的name属性自定义调用显示名称[...]@ParameterizedTest

虽然这允许在一定程度上自定义显示名称,但似乎我无法调整各个参数的字符串表示。不幸的是,指定生成器 via@DisplayNameGeneration只能在类级别应用,并且不会影响参数化测试调用的显示名称。

有没有办法使用DisplayNameGeneratorfor@ParameterizedTest或自定义给定参数的字符串表示?

4

2 回答 2

26

为了在 JUnit 直接支持之前间接实现您的目标,您始终可以向测试中添加所需字符串的参数。然后需要在参数提供者方法中进行定制。

@ParameterizedTest(name = "{index} {1}")
@MethodSource("argumentProvider")
public void testSomething(Object someObject, String niceRepresentation) {
    // Test something
}

private static Stream<Arguments> argumentProvider() {
    return Stream.of(
            Arguments.of(new Object(), "Nice 1"),
            Arguments.of(new Object(), "Nice 2")
    );
}

缺点是单元测试提供了测试实现中未使用的参数,这可能会损害清晰度,但随后它会与测试报告中的冗长名称进行权衡。

于 2019-09-11T17:35:04.303 回答
23

从 JUnit 5.8.0 开始,Named<T>作为 JUnit Jupiter API 一部分的接口具有“自动支持将包含的有效负载 [参数] 直接注入参数化方法”(参见问题 #2301)。例子:

@DisplayName("A parameterized test with named arguments")
@ParameterizedTest(name = "{index}: {0}")
@MethodSource("namedArguments")
void testWithNamedArguments(File file) {}

static Stream<Arguments> namedArguments() {
    return Stream.of(
        Arguments.of(Named.of("An important file", new File("path1"))),
        Arguments.of(Named.of("Another file", new File("path2")))
    );
}

如果您更喜欢静态导入,您还可以从Arguments和中获取相应的别名Named

arguments(named("An important file", new File("path1")))

更多信息请参考相应的文档

于 2021-04-07T22:33:16.527 回答