【问题标题】:Junit5 Error. You must provide at least one argument for this @ParameterizedTestJunit5 错误。您必须为此 @ParameterizedTest 提供至少一个参数
【发布时间】:2019-02-02 01:51:09
【问题描述】:

我正在尝试在 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 提供至少一个参数

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

p。 s。我有一个假设,只有原始类型的 args 可用。

【问题讨论】:

  • 不应该是@ArgumentsSource(CategoriesProvider.class)吗?
  • 是的,当然。这是问题文本中的错误。谢谢!

标签: java unit-testing junit5


【解决方案1】:

TL;DR

ArgClassProvider 设为静态或顶级类。

加长版

仔细查看错误信息:

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

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

要给你的ArgumentsProvider 实现the parameterless constructor it requires,你有两个选择:

  • 让它成为一个合适的类
  • 设为static,这样它就不再引用外部类的实例,并且隐式构造函数不带参数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 2018-02-04
    相关资源
    最近更新 更多