4

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

@RunWith(Parameterized.class)

背景:

我经历了如何为接口编写junit测试?并希望使用 JUnit5实现此处回答的测试用例。但是在 Jupiter 包中找不到相同的类/es。

尝试:

进一步寻找替代品,我发现Extensions将替换 @RunWith,如迁移技巧中所述

@RunWith 不再存在;被@ExtendWith 取代。

我尝试CustomExtension在此处的示例中定义 a - MockitoExtension但无法成功使用Parameterized类的实例。

期待有关如何使用实现它的类的参数化实例测试接口的建议JUnit5

4

4 回答 4

5

JUnit 5 M4 刚刚发布,现在支持参数化测试。

这是“Hello World”示例:

@ParameterizedTest
@ValueSource(strings = { "Hello", "World" })
void testWithStringParameter(String argument) {
    assertNotNull(argument);
}

有关完整文档和其他示例,请参阅用户指南

于 2017-04-02T08:09:58.270 回答
4

截至 2017 年 1 月 9 日,JUnit 5 本身不支持参数化测试,但该功能的工作正在进行中。请注意,您可能能够通过动态测试实现类似的效果。

也就是说,我会考虑两种不好的方法来实现接口测试,而 JUnit Jupiter 提供了两种更好的方法:

  1. @Test将执行带注释的接口默认方法。因此,如果您有一个生产接口Interface,您可以编写一个InterfaceTest使用默认方法的接口来测试您想要的所有内容。对于每一个Impl implements Interface你可以写一个ImplTest implements InterfaceTest.
  2. 如果您需要更大的灵活性并希望Interface在抽象类中实现测试,AbstractInterfaceTest您也可以这样做,然后在您的扩展中拥有一个嵌套的测试类ImplTestAbstractInterfaceTest

这两种方法都确保接口的测试不知道实现接口的类,这是您链接到的答案的一个巨大缺点。

于 2017-01-09T14:51:16.830 回答
2

您可以为此使用动态测试

@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]))
                        )
                );
}
于 2017-02-12T12:22:20.657 回答
1

在我的项目中,我一直在使用这个库:

https://github.com/TNG/junit-dataprovider/

为了向我的 JUnit 测试添加参数化。我一直在使用 4.x 版本,但从不喜欢它提供的嵌入式参数化。如果您熟悉 TestNg 的 @DataProvider,那么这个扩展并没有太大的不同。

看看它是否对你有任何好处,就像对我和我的团队一样。坦率地说,我现在无法想象没有它的工作。

于 2017-01-09T21:28:33.840 回答