我正尝试在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可用。
答案 0 :(得分:3)
将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
,因此它不再引用外部类的实例,隐式构造函数不使用任何参数