JUnit5 -如何将输入集合传递给ParameterizedTest



我正在尝试将ParameterizedTest从JUnit4翻译为JUnit5(遗憾的是我不是特别擅长测试)。

在JUnit4中我有以下类:

@RunWith(Parameterized.class)
public class AssertionTestCase {
private final TestInput testInput;
public AssertionTestCase(TestInput testInput) {
this.testInput = testInput;
}
@Parameterized.Parameters
public static Collection<Object[]> data() {
return AssertionTestCaseDataProvider.createDataCase();
}
@Test(timeout = 15 * 60 * 1000L)
public void testDailyAssertion() {
LOG.info("Testing input {}/{}", testInput.getTestCase(), testInput.getTestName());
//assert stuffs
}
}

AssertionTestCaseDataProvider类我有一个简单的方法生成Object[]的集合:

class AssertionTestCaseDataProvider {
static Collection<Object[]> createDataCase() {
final List<TestInput> testInputs = new ArrayList<>();
//create and populate testInputs
return testInputs.stream()
.map(testInput -> new Object[]{testInput})
.collect(Collectors.toList());
}
}

我一直试图用JUnit5翻译它,并获得了这个:

class AssertionTestCase {
private final TestInput testInput;
public AssertionTestCase(TestInput testInput) {
this.testInput = testInput;
}
public static Collection<Object[]> data() {
return AssertionTestCaseDataProvider.createDataCase();
}
@ParameterizedTest
@MethodSource("data")
void testDailyAssertion() {
LOG.info("Testing input {}/{}", testInput.getTestCase(), testInput.getTestName());
// assert stuffs
} 

}

我没有对AssertionTestCaseDataProvider类应用任何更改。然而,我得到了以下错误:

No ParameterResolver registered for parameter [com.xxx.xx.xxx.xxx.testinput.TestInput arg0] in constructor [public `com.xxx.xxx.xxx.xxx.xxx.AssertionTestCase(com.xxx.xxx.xxx.xxx.testinput.TestInput)]. org.junit.jupiter.api.extension.ParameterResolutionException: No ParameterResolver registered for parameter [com.xxx.xx.xxx.xxx.testinput.TestInput arg0] in constructor [public com.xxx.xxx.xxx.xxx.xxx.AssertionTestCase(com.xxx.xxx.xxx.xxx.testinput.TestInput)].`

我知道在初始化测试的输入集合时,我可能没有正确地应用JUnit5。我是不是漏掉了一些注释?

我也尝试使用@ArgumentSource代替@MethodSource,并为AssertionTestCaseDataProvider实现Argument,具有相同的失败结果。

它在Junit5中以另一种方式工作。测试方法应该有参数,提供者方法应该返回一个Stream

static Stream<Arguments> data(){
return Stream.of(
Arguments.of("a", 1),
Arguments.of("d", 2)
);
}
@ParameterizedTest
@MethodSource("data")
void testDailyAssertion(String a, int b) {
Assertions.assertAll(
() -> Assertions.assertEquals("a", a),
() -> Assertions.assertEquals(1, b)
);
}

在您的情况下,您可以只返回一个Stream;

static Stream<TestInput> createDataCase() {
final List<TestInput> testInputs = new ArrayList<>();
//create and populate testInputs
return testInputs.stream();
}
然后在testMethod中:
@ParameterizedTest
@MethodSource("createDataCase")
void testDailyAssertion(TestInput testInput) {
{your assertions}
} 

最新更新