很难弄清楚如何在接受集合的@ForAll函数上使用jqwik中的@Provide。
考虑:
// domain model
public class Name {
public final String first;
public final String last;
public Name(String f, String l) {
this.first = f;
this.last = l;
}
}
// jqwik domain context
public class NameDomain extends DomainContextBase {
@Provide
public Arbitrary<Name> arbName() {
return Combinators.combine(
Arbitraries.strings().alpha(),
Arbitraries.strings().alpha()
).as(Name::new);
}
}
// properties test
public class NameProperties {
// obviously a made-up use case, just demonstrating the issue
@Provide
@Domain(NameDomain.class)
public Arbitrary<Set<String>> namesToParse(
@ForAll @Size(min = 1, max = 4) Set<Name> names) {
// ... code here
}
@Property
public void namesAreParsed(@ForAll("namesToParse") Set<String> names) {
// ... code here
}
}在运行该程序时,我将得到以下结果:
supplier=net.jqwik.api.ArbitrarySupplier$NONE.class) mypackage.NameProperties.namesToParse(java.util.Set)中
net.jqwik.api.CannotFindArbitraryException:无法找到@net.jqwik.api.ForAll(value="",value=0 @net.jqwik.api.constraints.Size(value=0,max=4,min=1)类型参数的任意设置)
类似的问题试图使用@UniqueElements List<Name>代替。我在这里错过了什么?
发布于 2022-11-19 10:09:04
您所缺少的是@Domain注释只能应用于属性方法或它们的容器类。因此,应采取的措施是:
@Property
@Domain(NameDomain.class)
public void namesAreParsed(@ForAll("namesToParse") Set<String> names) {
// ... code here
}或
@Domain(NameDomain.class)
class NameProperties { ... }尽管如此,您应该知道,在提供方法中使用@ForAll参数将始终使用对注入参数的平面映射。如果您实际上只想映射或组合注入的参数,请不要使用该方法。在这种情况下,您的提供方法应该类似于:
@Provide
public Arbitrary<Set<String>> namesToParse() {
SetArbitrary<Name> names = Arbitraries.defaultFor(Name.class)
.set().ofMinSize(1).ofMaxSize(4);
// Code here just an example of what could be done:
return names.mapEach((Set<Name> ignore, Name n) -> n.first + " " + n.last);
}https://stackoverflow.com/questions/74493046
复制相似问题