java - 是否可以在 Junit 5 中使用 Java 功能接口(interface)实现(例如 Supplier)作为 MethodSource?

标签 java junit5 functional-interface

运行集成测试我将它们的参数存储为不同文件中的 json。这些文件存储不同的测试用例,然后用不同的方法进行测试。

我想知道是否可以创建一个通用的读取文件方法,例如这个:

  static Stream<Arguments> argumentsOf(String fileName) {
    Path argumentsFilePath = Paths.get(ARGUMENTS_FILES_DIRECTORY + fileName);
    //read and return arguments stored in a file 
  }

连同像这样的功能界面:

     static Supplier<Stream<Arguments>> anExampleArgument =
      () -> argumentsOf("some_test_case_argument.json");

所以我可以这样做:

  @ParameterizedTest
  @MethodSource("anExampleArgument.get")
  void test1(String exampleArgument) {
  //...
  }

我找不到有关此场景的任何信息。上面看到的示例代码导致

org.junit.platform.commons.JUnitException: Could not find factory method [anExampleArgument.get] in class [com.company.ExampleIntegrationTest]

最佳答案

不,目前你所描述的似乎是不可能的。

MethodSource 的文档对此不是很清楚,但看its JavaDoc可能会提供一些见解:

Factory methods in external classes must be referenced by fully qualified method name — for example, com.example.StringsProviders#blankStrings.

引发您看到的异常的代码是 here :

private Method getMethod(Class<?> clazz, String methodName) {
    return ReflectionUtils.findMethod(clazz, methodName).orElseThrow(() -> new JUnitException(
    format("Could not find factory method [%s] in class [%s]", methodName, clazz.getName())));
}

可悲的是,他们的ReflectionUtils类似乎不包含任何用于评估方法后附加调用的功能,因此它将您的字符串视为完全限定的方法名称。

也许您会根据 this answer 创建自己的 ArgumentsProvider 受益?

正如评论者指出的那样,也许 Dynamic Tests也可能适用于您的用例。

关于java - 是否可以在 Junit 5 中使用 Java 功能接口(interface)实现(例如 Supplier)作为 MethodSource?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59263429/

相关文章:

java - 使用 JUnit 5 从 CSV 文件读取测试数据的最佳方法是什么?

spring-boot - Mockito:监视功能接口(interface)内的函数调用?

java - 有没有办法返回一行代码? java

java - Android Studio 错误 : Plugin with id 'com.google.gms.google-services' not found

java - 尝试执行 junit 测试时出错

java - void @Async 方法的单元测试用例

java-8 - 为什么在 Java 8 中使用 @FunctionalInterface 注解

Java 8 多重映射

java - 使用 Akka 实现 MapReduce

java - 如何使用@Scheduled注释多次安排同一任务