[英]Junit5 Duplicated parameter in parameterized test
我有一個 function 接收兩個對象並返回“最大”一個。 對於這個問題,“最大”的確定並不重要。 我有一個參數化測試,如下所示:
@ParameterizedTest()
@MethodSource
void testGetLargest(Widget widget1, Widget widget2, Widget expectedLargestWidget) {
var largestWidget = service.getLargestWidget(widget1, widget2);
assertEquals(expectedLargestWidget, largestWidget);
}
private static Stream<Arguments> testGetLargest() {
return Stream.of(
Arguments.of(
Widget.builder().field1("something").field2("something else").build(),
Widget.builder().field1("second something").field2("second something else").build(),
**not sure what to put here**),
...
如您所見,測試的第三個參數應該與前兩個參數之一相同。 雖然我可以復制代碼並制作與前兩個相同的第三個參數,但這感覺很混亂。
有沒有辦法構建 arguments 以使我可以將相同的 object 作為前兩個參數之一作為第三個參數傳遞?
或者在我的測試中,我可以引用現有參數之一作為第三個參數? 我考慮過讓第三個參數是一個 int,它代表前兩個參數之一的索引,然后使用反射,但這也感覺很重。
我想你有點想多了,既然你知道哪一個應該是最大的,你總是可以把預期的一個作為第一個參數,然后比較largestWidget
和它,你只需要兩個參數:
@ParameterizedTest()
@MethodSource
void testGetLargest(Widget widget1, Widget widget2) {
var largestWidget = service.getLargestWidget(widget1, widget2);
assertEquals(widget1, largestWidget);
}
而不是@MethodSource
您可以嘗試@CsvSource
。
當我在一個參數化測試中需要 3 個 Integer 參數時,我這樣做了。
這是我的測試方法的簽名:
@ParameterizedTest
@CsvSource("300,10,", "150,5,", "90,9,0", "100,0,10")
fun totalScoreTests(result: Int, firstThrow: Int, secondThrow: Int?)
它是 Kotlin 而不是 Java,但 JUnit 5 可用於兩種語言。
如果您搜索“GameTest”,您可以在這篇博文中找到我的完整示例:
https://agile-coding.blogspot.com/2021/06/clean-code-dojo.html
這似乎是第二天重新審視會導致非常明顯的答案的情況。 我更新了我的 methodSource function 以首先構建對象,然后將引用傳遞給它們,這使我可以重用對最大小部件的引用。
private static Stream<Arguments> testGetLargest() {
Widget widget1 = Widget.builder().field1("something").field2("something else").build();
Widget widget2 = Widget.builder().field1("second something").field2("second something else").build();
return Stream.of(
Arguments.of(
widget1,
widget2,
widget1),
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.