簡體   English   中英

Junit5參數化測試中的重復參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM