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

Grz*_*rek 0 java parameterized-unit-test kotlin junit5

我想用三个参数来参数我JUnit5测试:stringstringlist<string>

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

没有隐式转换将类型java.lang.String的对象转换为类型java.util.List

实际测试是:

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

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

Sam*_*nen 6

没有必要根据StefanE的建议使用黑客手段。

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

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

因此@CsvSource,应该使用a 代替使用a @MethodSource

@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"))
    );
}
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考:我更新了 JUnit 5.1 的用户指南以包含这样的示例。https://github.com/junit-team/junit5/commit/eb6e401fde681d7da649025391691ff5a45ca0f0 (6认同)
  • 使用 MethodSource 来满足这种需求是多余的。这是许多应用程序的共同要求。JUnit 应该提供一种更简单的方法来注入参数列表,而无需处理 MethodSource。像 @ListSource("value1" , "value2", "value3") 这样的东西就很完美 (4认同)
  • 由此产生的文档更改已在最新快照中可见:http://junit.org/junit5/docs/snapshot/user-guide/#writing-tests-parameterized-tests-sources-MethodSource (2认同)