如何将列表作为 JUnit5 的参数化测试参数传递?

How to pass a list as a JUnit5's parameterized test parameter?

我想使用三个参数参数化我的 JUnit5 测试:stringstringlist<string>

到目前为止,使用 @CsvSource 时运气不佳,这是为我的用例传递参数的最便捷方式:

No implicit conversion to convert object of type java.lang.String to type java.util.List

实际测试是:

@ParameterizedTest()
@CsvSource(
  "2,1"
 )
fun shouldGetDataBit(first: Int, second: String, third: List<String>) {
    ...
}

知道这是否可能吗?我在这里使用 Kotlin,但它应该无关紧要。

将第三个元素作为逗号分隔的字符串提供,并将该字符串拆分为您测试中的列表。

在这一点上,我很确定 Junit5 测试参数不支持除原始类型之外的任何其他类型,而 CsvSource 仅支持一种允许混合类型的类型。

没有理由按照 StefanE 的建议使用 hack

At this point I'm pretty sure Junit5 Test Parameters does not support anything else than primitive types and CsvSource only one allowing mixing of the types.

实际上,JUnit Jupiter 支持任何类型的参数。只是 @CsvSource 仅限于一些原始类型和 String.

因此,您应该使用 @MethodSource,而不是使用 @CsvSource,如下所示。

@ParameterizedTest
@MethodSource("generateData")
void shouldGetDataBit(int first, String second, List<String> third) {
    System.out.println(first);
    System.out.println(second);
    System.out.println(third);
}

static Stream<Arguments> generateData() {
    return Stream.of(
        Arguments.of(1, "foo", Arrays.asList("a", "b", "c")),
        Arguments.of(2, "bar", Arrays.asList("x", "y", "z"))
    );
}