有没有办法在JUnit Jupiter
(Junit5
)中进行参数化测试?
@RunWith(Parameterized.class)
背景:
我经历了How to write junit tests for interfaces?并希望使用JUnit5将测试用例实现为answered here。但是在Jupiter包中找不到相同的类/ es。
尝试:
进一步寻找替代品我发现Extensions将取代Migrating tips
中所述的@RunWith@RunWith不再存在;被@ExtendWith取代。
我尝试定义示例 here - MockitoExtension中提供的CustomExtension
,但无法成功使用参数化类的实例。
期待有关如何使用JUnit5
中实现它的类的参数化实例测试接口的建议。
答案 0 :(得分:5)
JUnit 5 M4刚刚发布,现在支持参数化测试。
这是" Hello World"例如:
@ParameterizedTest
@ValueSource(strings = { "Hello", "World" })
void testWithStringParameter(String argument) {
assertNotNull(argument);
}
有关完整文档和其他示例,请参阅User Guide。
答案 1 :(得分:4)
截至2017年1月9日,JUnit 5本身并不支持参数化测试,而是使用该功能is in progress。请注意,您可以使用dynamic tests实现类似的功能。
那就是说,我会考虑两种不好的方法来实现接口测试,而JUnit Jupiter提供了两种更好的方法:
@Test
带注释的接口默认方法will be executed。因此,如果您有一个生产接口Interface
,您可以编写一个接口InterfaceTest
,它使用默认方法来测试您想要的所有内容。对于每个Impl implements Interface
,您可以编写ImplTest implements InterfaceTest
。Interface
中实现AbstractInterfaceTest
的测试,您也可以这样做,然后在{{1}中使用nested test class扩展ImplTest
。这两种方法都确保接口测试不会知道实现接口的类,这是answer you linked to的一个巨大缺点。
答案 2 :(得分:2)
您可以使用dynamic tests:
@TestFactory
Stream<DynamicTest> params() {
return Stream.of(new double[][]{{2d, 4d}, {3d, 9d}, {4d, 16d}}).
map(i ->
dynamicTest("Square root test " + Arrays.toString(i),
() -> assertEquals(i[0], Math.sqrt(i[1]))
)
);
}
答案 3 :(得分:1)
在我的项目中,我一直在使用这个库:
https://github.com/TNG/junit-dataprovider/
为了向我的JUnit测试添加参数化。 我一直在使用版本4.x,但从未成为它提供的嵌入式参数化的粉丝。 如果您熟悉TestNg的@DataProvider,则此扩展名没有太大差异。
检查一下,看看它对我和我的团队是否有任何好处。坦率地说,我无法想象现在没有它。