java - Function<T, R> 作为 Junit 5 中的附加参数

标签 java junit

我正在尝试将测试参数传递给 JUnit 5,其中包括 Java 的 Function<T, R>接口(interface)类型如下面的代码片段所示。我收到“Lambda 转换的目标类型必须是接口(interface)”错误,因为 JUnit 5 的 Arguments type 使用对象数组来存储参数。

  @ParameterizedTest(name = "Test description: {0}")
  @MethodSource("generateArguments")
  void passFunctionAsAnArgumentTest(final String description, final Function<String, String> testMethod) {

    // Fetch initial preactivation value.
    final String result = testMethod.apply("input");
    assertThat(result, is("expected"));
  }

  private static Stream<Arguments> generateArguments() {

    return Stream.of(
        // Error: "Target type of a lambda conversion must be an interface".
        Arguments.of("Return 'expected' if argument is 'input'", (String input) -> generateStringFromInput(input))
    );
  }

  private static String generateStringFromInput(final String input) {

    return input.equals("input") ? "expected" : "wrong";
  }

如果我生成一个使用 Function<T, R> 的流测试编译并运行良好的接口(interface)类型。

  @ParameterizedTest(name = "No test description :(")
  @MethodSource("generateStream")
  void passFunctionAsAnArgumentTest(final Function<String, String> testMethod) {

    // Fetch initial preactivation value.
    final String result = testMethod.apply("input");
    assertThat(result, is("expected"));
  }

  private static Stream<Function<String, String>> generateStream() {

    return Stream.of(
        JUnitFeatureTest::generateStringFromInput
    );
  }

  private static String generateStringFromInput(final String input) {

    return input.equals("input") ? "expected" : "wrong";
  }

显然实际的代码要复杂一些。我想传递函数而不是测试数据对象的原因是因为我们使用不同的参数集调用不同的方法。将其封装在辅助方法中要整洁得多。

最佳答案

您需要告诉编译器您打算实现哪种类型的 lambda。
所以你需要将 lambda 转换为 Function<String, String>像这样:

private static Stream<Arguments> generateArguments() {
  return Stream.of(
      Arguments.of(
          "Return 'expected' if argument is 'input'",
          (Function<String, String>) JUnitFeatureTest::generateStringFromInput
      )
  );
}

或者这个

private static Stream<Arguments> generateArguments() {
  return Stream.of(
      Arguments.of(
          "Return 'expected' if argument is 'input'", 
          (Function<String, String>) input -> generateStringFromInput(input)
      )
  );
}

关于java - Function<T, R> 作为 Junit 5 中的附加参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70127774/

相关文章:

Java读取西里尔语CSV文件,写入奇怪的字符

java - 一个 do while 循环内的 if-else 循环 另一个 do while 循环内的 if-else 循环

java - 如何从方法中增加实例变量

java - 使用 JUnit 框架

java - sysout 重定向到 swing 控制台,log4j 内容不会

java - Selenium 将 Web 表格与 Excel 数据进行比较

java - jUnit4.0 : how to know current test method name?

java - 测试Spring onApplicationEvent的简单方法

java - 使用 Arquillian TestRunner TestNG 按顺序执行测试

spring - spring boot 测试中的事务未回滚