首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用@ForAll和集合的jqwik在@Provide注释的方法中

使用@ForAll和集合的jqwik在@Provide注释的方法中
EN

Stack Overflow用户
提问于 2022-11-18 17:01:03
回答 1查看 25关注 0票数 1

很难弄清楚如何在接受集合的@ForAll函数上使用jqwik中的@Provide

考虑:

代码语言:javascript
复制
// 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>代替。我在这里错过了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-19 10:09:04

您所缺少的是@Domain注释只能应用于属性方法或它们的容器类。因此,应采取的措施是:

代码语言:javascript
复制
@Property
@Domain(NameDomain.class)
public void namesAreParsed(@ForAll("namesToParse") Set<String> names) {
    // ... code here
}

代码语言:javascript
复制
@Domain(NameDomain.class)
class NameProperties { ... }

尽管如此,您应该知道,在提供方法中使用@ForAll参数将始终使用对注入参数的平面映射。如果您实际上只想映射或组合注入的参数,请不要使用该方法。在这种情况下,您的提供方法应该类似于:

代码语言:javascript
复制
@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);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74493046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档