2

我正在使用 JUnit 5.7.0、IntellijIDEA 2021.1.2 CE、MacOS Catalina 10.15。并且不明白 和 之间的 ParameterizedTest.ARGUMENTS_PLACEHOLDER区别ParameterizedTest.ARGUMENTS_WITH_NAMES_PLACEHOLDER

根据 javadocARGUMENTS_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, 1", "banana, 2", "'lemon, lime', 3" })
void testWithNamedArguments(String fruit, int rank) {
}

在此处输入图像描述

谁能提供这两个占位符行为不同的示例?

4

2 回答 2

1

如果您使用@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) {
}

我得到了正确的结果:

在此处输入图像描述

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

于 2021-06-27T13:17:09.360 回答
0

解决方案

为了ARGUMENTS_WITH_NAMES_PLACEHOLDER按预期工作,必须使用
-parameters标志编译测试。然后,参数名称将 1) 存储,并且 2) 能够随后由 JUnit 通过反射检索。

在实践中

对于使用 Gradle 构建的 Java 项目,以下内容将专门为测试启用此标志:

tasks.named('compileTestJava') {
    options.compilerArgs += '-parameters'
}

参考

  • 来自Java 8javac文档:

    -parameters 将构造函数和方法的形式参数名称存储在生成的类文件中,以便java.lang.reflect.Executable.getParameters反射 API 中的方法可以检索它们。

  • 自然,JUnit 使用反射来获取参数名称。例如,签出ParameterizedTestMethodContext#getParameterName(来自 v5.7.1 的示例)。

于 2022-01-13T19:26:52.650 回答