2017-01-09 38 views
4

有没有办法在JUnit JupiterJunit5)中进行参数化测试?JUnit Jupiter(JUnit5)中的参数化测试执行

@RunWith(Parameterized.class) 

背景:

我通过How to write junit tests for interfaces?去了,想用JUnit5实现测试用例answered here。但是在Jupiter软件包中找不到相同的类。

尝试:

寻找进一步的替代品,我发现Extensions将取代@RunWith为Migrating tips

@RunWith不复存在陈述;被@ExtendWith取代。

我试图定义一个CustomExtension作为样本 here - MockitoExtension中提供,但在获得使用类参数的情况下,根本不可能成功。

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

回答

4

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

这里的 “Hello World” 的例子:

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

请参阅User Guide为完整的文档和其他示例。

4

截至2017年1月9日,JUnit 5本身不支持参数化测试,但是可以使用该功能is in progress。请注意,您可能能够实现与dynamic tests类似的操作。

这就是说,我会考虑这两个坏的方式来实现接口测试和JUnit木星提供了两种更好的方法:

  1. @Test注释的接口默认方法will be executed。所以如果你有一个生产接口Interface你可以编写一个接口InterfaceTest,它使用默认方法来测试你想要的一切。每Impl implements Interface你可以写一个ImplTest implements InterfaceTest
  2. 如果您需要更多的灵活性,并希望实现对Interface测试在抽象类AbstractInterfaceTest你可以做到这一点,以及,然后在你的ImplTest扩展AbstractInterfaceTest一个nested test class

这两种方法都可以确保接口的测试不知道实现接口的类,这是answer you linked to的一个巨大缺点。

1

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

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

以参数添加到我的JUnit测试。 我一直在使用4.x版本,但从未成为它提供的嵌入式参数化的粉丝。 如果你对TestNg的@DataProvider很熟悉,那么这个扩展没有太大的区别。

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

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])) 
         ) 
       ); 
}