Junit5参数化测试中的重复参数

Junit5 Duplicated parameter in parameterized test

我有一个函数接收两个对象,returns“最大的”一个。就此问题而言,“最大”的确定并不重要。我有一个如下所示的参数化测试:

@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**),
                    ...

如您所见,测试的第三个参数应与前两个参数之一相同。虽然我可以复制代码并创建与前两个相同的第三个参数,但这感觉很乱。

有没有一种方法可以构建参数,使我可以将与前两个参数之一相同的对象作为第三个参数传递?

或者在我的测试中,我可以引用现有参数之一作为第三个参数? 我考虑过让第三个参数是一个表示前两个参数之一的索引的 int,然后使用反射,但这也感觉很重。

您可以尝试 @CsvSource,而不是 @MethodSource
当我在一个参数化测试中需要 3 个整数参数时,我就这样做了。
这是我的测试方法的签名:

@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”:
,您可以在此博客 post 中找到我的完整示例 https://agile-coding.blogspot.com/2021/06/clean-code-dojo.html

这似乎是第二天焕然一新的情况会得出非常明显的答案。我更新了我的 methodSource 函数以首先构建对象,然后将引用传递给它们,这使我可以重用对最大小部件的引用。

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),
                    ...

我觉得你想多了,既然你知道哪个应该是最大的,你总是可以把预期的作为第一个参数,然后比较largestWidget 有了它,你只需要两个参数:

@ParameterizedTest()
@MethodSource
void testGetLargest(Widget widget1, Widget widget2) {
   var largestWidget = service.getLargestWidget(widget1, widget2);

   assertEquals(widget1, largestWidget);
}