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

Mak*_*lau 1 java unit-testing junit5

我正在尝试在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);
    }
}
Run Code Online (Sandbox Code Playgroud)

尝试运行测试会导致异常:

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
...
Run Code Online (Sandbox Code Playgroud)

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

此消息使我感到自己做错了,不是吗?

ps我有一个假设,只有基本类型的args可用。

Nic*_*lai 5

TL; DR

使ArgClassProvider静态或顶级类。

长版

仔细查看错误消息:

java.lang.NoSuchMethodException:
com.ots.platform_sl.service.config.service.EarnMilesServiceTestHotels$ArgClassProvider.<init>()
Run Code Online (Sandbox Code Playgroud)

您在这里看到的是Jupiter找不到的无参数构造函数ArgClassProvider。原因是它是一个非静态内部类,这意味着它的隐式构造函数将外部类的一个实例(在这种情况下EarnMilesServiceTestHotels)作为参数。

要为ArgumentsProvider实现提供所需的无参数构造函数,您有两个选择:

  • 使它成为适当的课程
  • make it static,因此它不再引用外部类的实例,并且隐式构造函数不带参数