0

我正在尝试从 JUnit4 迁移到 JUnit5,而且我是 Junit5 中的 ParametrizedTest 的新手,我有一个场景,我想提供不同的 DisplayName 和 Test 参数(对象)。

这是我想用作 @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)]

您能否指导我在这里做错了什么!

谢谢

4

1 回答 1

0

在 JUnit 5 中提供测试数据Collection<Object[]>不再是合适的方式。您可以使用 aStream代替。如果您需要为您的测试提供多个参数,您可以使用Arguments它们来包装它们。它们在测试执行时自动解包。下面的示例给出了如何做到这一点的总体思路。您可以替换TestCaseMyClass并将您的TestCaseReader代码插入到data.

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;
    }
  }
}
于 2022-01-23T14:33:43.100 回答