JUnit Jupiter中的参数化测试执行(JUnit5)

时间:2017-01-09 14:36:28

标签: java unit-testing junit parameterized junit5

有没有办法在JUnit JupiterJunit5)中进行参数化测试?

@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中实现它的类的参数化实例测试接口的建议。

4 个答案:

答案 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提供了两种更好的方法:

  1. @Test带注释的接口默认方法will be executed。因此,如果您有一个生产接口Interface,您可以编写一个接口InterfaceTest,它使用默认方法来测试您想要的所有内容。对于每个Impl implements Interface,您可以编写ImplTest implements InterfaceTest
  2. 如果您需要更多灵活性并希望在抽象类Interface中实现AbstractInterfaceTest的测试,您也可以这样做,然后在{{1}中使用nested test class扩展ImplTest
  3. 这两种方法都确保接口测试不会知道实现接口的类,这是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,则此扩展名没有太大差异。

检查一下,看看它对我和我的团队是否有任何好处。坦率地说,我无法想象现在没有它。