junit5 - JUnit5 - 如何将输入集合传递给 ParameterizedTest
问题描述
我正在尝试将 aParameterizedTest
从 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
实现Argument
for AssertionTestCaseDataProvider
,但结果相同。
解决方案
它在 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<TestInput>:
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}
}
推荐阅读
- redux - NextJs 中间件和 redux 存储
- reactjs - 为什么样式系统响应数组不起作用?
- list - 如何在颤动中显示列表中的图像
- gooddata - 在分析器中嵌入 Web 内容
- firebase - 如何为每个类别创建自定义选项?
- excel - extjs gridexporter 错误与网格中的表情符号
- javascript - 获取html网站中的SBC微浏览器内容
- flutter - 如何删除 TextFormField 下方的错误消息?
- php - PHPUnit ENV 变量在外部类中不可用
- python - 即使正确安装,也无法在 Jupyter 笔记本中导入 pygame