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 的实例并且隐式构造函数不带参数
我正在尝试在 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 的实例并且隐式构造函数不带参数