JUnit 5 @ParamterizedTest {arguments} 与 {argumentsWithNames} 占位符

问题描述

我使用的是 JUnit 5.7.0、IntellijIDEA 2021.1.2 CE、MacOS Catalina 10.15。并且不明白两者之间的区别 ParameterizedTest.ARGUMENTS_PLACEHOLDERParameterizedTest.ARGUMENTS_WITH_NAMES_PLACEHOLDER

根据 javadoc ARGUMENTS_WITH_NAMES_PLACEHOLDER 处理命名参数,而 ARGUMENTS_PLACEHOLDER 只处理参数。 两个测试在 IDEA 中的测试结果看起来是一样的:

import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;

@ParameterizedTest(name = ARGUMENTS_WITH_NAMES_PLACEHOLDER)
@CsvSource({"apple,1","banana,2","'lemon,lime',3" })
void testWithArguments(String fruit,int rank) {
}

@ParameterizedTest(name = ARGUMENTS_PLACEHOLDER)
@CsvSource({"apple,3" })
void testWithNamedArguments(String fruit,int rank) {
}

enter image description here

谁能举例说明这两个占位符的行为不同?

解决方法

如果您使用 @ParameterizedTest(name = ARGUMENTS_WITH_NAMES_PLACEHOLDER),您将获得 parameterName + "=" + paraveterValue 的输出结果。

但是如果你使用 @ParameterizedTest(name = ARGUMENTS_PLACEHOLDER) 你只会得到 paraveterValue

此外,您可以在 javadoc 中看到:

Placeholder for the complete,comma-separated named arguments list of the current invocation of a @ParameterizedTest method: {argumentsWithNames}

@API(status = EXPERIMENTAL,since = "5.6")
String ARGUMENTS_WITH_NAMES_PLACEHOLDER = "{argumentsWithNames}";

Default display name pattern for the current invocation of a @ParameterizedTest method: "[{index}] {argumentsWithNames}"
Note that the default pattern does not include the display name of the @ParameterizedTest method.

@API(status = EXPERIMENTAL,since = "5.3")
String DEFAULT_DISPLAY_NAME = "[" + INDEX_PLACEHOLDER + "] " + ARGUMENTS_WITH_NAMES_PLACEHOLDER;

我试着像这样运行你的代码:

@ParameterizedTest(name = ARGUMENTS_WITH_NAMES_PLACEHOLDER)
@CsvSource({"apple,1","banana,2","'lemon,lime',3" })
void testWithNamedArguments(String fruit,int rank) {
}

我得到了正确的结果:

enter image description here

我使用 jupiter 5.6.3,功能 ARGUMENTS_WITH_NAMES_PLACEHOLDER 从 5.6 版本开始出现。