2017-01-09 37 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])) 
         ) 
       ); 
}