Junit5 错误。您必须为此 @ParameterizedTest 提供至少一个参数

Junit5 Error. You must provide at least one argument for this @ParameterizedTest

我正在尝试在 JUnit 5 中开发参数化测试,如下例所示。

@ParameterizedTest
@ArgumentsSource(ArgClassProvider.class)
void testAction_shouldSmth(ArgClass argClass) {
   //...
}


class ArgClassProvider implements ArgumentsProvider {

    @Override
    public Stream<? extends Arguments> provideArguments(ExtensionContext extensionContext) throws Exception {
        return Stream.of(new ArgClass(), new ArgClass()).map(Arguments::of);
    }
}

尝试 运行 测试导致异常:

java.lang.NoSuchMethodException: com.ots.platform_sl.service.config.service.EarnMilesServiceTestHotels$ArgClassProvider.<init>()
...
org.junit.platform.commons.util.PreconditionViolationException: Configuration error: You must provide at least one argument for this @ParameterizedTest
...

您必须为此@ParameterizedTest提供至少一个参数

这条消息让我觉得我做错了什么,不是吗?

页。秒。我有一个假设,只有原始类型的参数可用。

TL;DR

ArgClassProvider 设为静态或顶级 class。

长版

仔细查看错误信息:

java.lang.NoSuchMethodException:
com.ots.platform_sl.service.config.service.EarnMilesServiceTestHotels$ArgClassProvider.<init>()

你在这里看到的是 Jupiter 找不到 ArgClassProvider 的无参数构造函数。原因是它是 a non-static inner class,这意味着它的隐式构造函数将外部 class(在本例中为 EarnMilesServiceTestHotels)的实例作为参数。

要提供 ArgumentsProvider 实现 the parameterless constructor it requires,您有两个选择:

  • 让它成为一个合适的 class
  • 使其成为 static,因此它不再引用外部 class 的实例并且隐式构造函数不带参数