带有显示名称和参数的参数化测试
ParametrizedTest with displayName and Argument
我正在尝试从 JUnit4 迁移到 JUnit5,而且我是 Junit5 中的 ParametrizedTest 的新手,我有一个场景,我想提供不同的 DisplayName 和测试参数(对象)。
这是我想用作@MethodSource("data")
的输入的数据源
public static Collection<Object[]> data() throws IOException {
List<Object[]> testCaseData = new ArrayList<>();
TestCaseReader testCaseReader = new TestCaseReader(TESTCASE_CSV_RESOURCE);
List<MyClass> testCaseList = testCaseReader.readTestCases();
for (MyClass testCase : testCaseList) {
if (testCase.isActive()) {
Object[] testParameter = new Object[2];
testParameter[0] = String.format("%03d: %s", testCase.getStartingLineNumber(), testCase.getName());
testParameter[1] = testCase;
testCaseData.add(testParameter);
}
}
return testCaseData;
}
这是测试
@ParameterizedTest(name = "Scenario: {0}, testCase={1}")
@MethodSource("data")
public void process(MyClass testCase) {
//...
//some operating on testCase methods/variables
}
执行 TestCase 时,我看到 DisplayName 被正确拾取,但它说其他参数不可解析
org.junit.jupiter.api.extension.ParameterResolutionException: Failed to resolve parameter [com.sample.MyClass testCase] in method [public void.MultipleTestCase.process(com.sample.MyClass testCase)]
你能指导我这里做错了什么吗?
谢谢
以 Collection<Object[]>
的形式提供测试数据在 JUnit 5 中不再适用。您可以改用 Stream
。如果你需要为你的测试提供多个参数,你可以使用 Arguments
来包装它们。它们会在测试执行时自动展开。下面的例子给出了如何做到这一点的一般思路。您可以将 TestCase
替换为 MyClass
并在 data
.
中插入您的 TestCaseReader
代码
public class ParameterizedTest {
static Stream<Arguments> data() {
// TODO: Add your TestCaseReader usage to create MyClass / TestCase instances.
List<TestCase> testCases =
List.of(new TestCase("test01", "data01"), new TestCase("test02", "data02"));
return testCases.stream().map(test -> Arguments.arguments(test.getName(), test));
}
@org.junit.jupiter.params.ParameterizedTest(name = "Scenario: {0}, testCase={1}")
@MethodSource("data")
public void process(String name, TestCase testCase) {
System.out.println(name + ": " + testCase.getData());
// TODO: Work with your test case.
}
private static final class TestCase {
private final String name;
private final String data;
public TestCase(String name, String data) {
this.name = name;
this.data = data;
}
public String getName() {
return name;
}
public String getData() {
return data;
}
}
}
我正在尝试从 JUnit4 迁移到 JUnit5,而且我是 Junit5 中的 ParametrizedTest 的新手,我有一个场景,我想提供不同的 DisplayName 和测试参数(对象)。
这是我想用作@MethodSource("data")
的输入的数据源 public static Collection<Object[]> data() throws IOException {
List<Object[]> testCaseData = new ArrayList<>();
TestCaseReader testCaseReader = new TestCaseReader(TESTCASE_CSV_RESOURCE);
List<MyClass> testCaseList = testCaseReader.readTestCases();
for (MyClass testCase : testCaseList) {
if (testCase.isActive()) {
Object[] testParameter = new Object[2];
testParameter[0] = String.format("%03d: %s", testCase.getStartingLineNumber(), testCase.getName());
testParameter[1] = testCase;
testCaseData.add(testParameter);
}
}
return testCaseData;
}
这是测试
@ParameterizedTest(name = "Scenario: {0}, testCase={1}")
@MethodSource("data")
public void process(MyClass testCase) {
//...
//some operating on testCase methods/variables
}
执行 TestCase 时,我看到 DisplayName 被正确拾取,但它说其他参数不可解析
org.junit.jupiter.api.extension.ParameterResolutionException: Failed to resolve parameter [com.sample.MyClass testCase] in method [public void.MultipleTestCase.process(com.sample.MyClass testCase)]
你能指导我这里做错了什么吗?
谢谢
以 Collection<Object[]>
的形式提供测试数据在 JUnit 5 中不再适用。您可以改用 Stream
。如果你需要为你的测试提供多个参数,你可以使用 Arguments
来包装它们。它们会在测试执行时自动展开。下面的例子给出了如何做到这一点的一般思路。您可以将 TestCase
替换为 MyClass
并在 data
.
TestCaseReader
代码
public class ParameterizedTest {
static Stream<Arguments> data() {
// TODO: Add your TestCaseReader usage to create MyClass / TestCase instances.
List<TestCase> testCases =
List.of(new TestCase("test01", "data01"), new TestCase("test02", "data02"));
return testCases.stream().map(test -> Arguments.arguments(test.getName(), test));
}
@org.junit.jupiter.params.ParameterizedTest(name = "Scenario: {0}, testCase={1}")
@MethodSource("data")
public void process(String name, TestCase testCase) {
System.out.println(name + ": " + testCase.getData());
// TODO: Work with your test case.
}
private static final class TestCase {
private final String name;
private final String data;
public TestCase(String name, String data) {
this.name = name;
this.data = data;
}
public String getName() {
return name;
}
public String getData() {
return data;
}
}
}