首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将参数传递给@Provide?

如何将参数传递给@Provide?
EN

Stack Overflow用户
提问于 2021-08-26 18:53:13
回答 1查看 52关注 0票数 1

有没有办法把参数传递给@Provide?我想要的东西相当于以下内容:

代码语言:javascript
复制
@Property
void test(@ForAll("charSequence", 2, 5) CharSequence cs) {
    // test property on cs, which is an arbitrary CharSequence of length minimum 2 and maximum length 5
}

@Provide
Arbitrary<CharSequence> charSequence(int minLength, int maxLength) {
    Arbitrary<String> stringArbitrary = Arbitraries.strings().ofMinLength(minLength).ofMaxLength(maxLength).injectNull(0.01);
    Arbitrary<StringBuffer> stringBufferArbitrary = stringArbitrary.map
        (str -> null == str ? null : new StringBuffer(str));
    Arbitrary<StringBuilder> stringBuilderArbitrary = stringArbitrary.map
        (str -> null == str ? null : new StringBuilder(str));
    return Arbitraries.oneOf(stringArbitrary, stringBufferArbitrary, stringBuilderArbitrary);
}

我尝试创建自定义注释

代码语言:javascript
复制
public @interface Length {
    int min();
    int max();
}

并按照Provider Methods with Parameters中的建议将其用作void test(@ForAll("charSequence") @Length(min = 2, max = 5) CharSequence cs),但TypeUsage似乎没有采用自定义批注@Length。(仅拾取@ForAll。)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-27 06:05:17

jqwik目前没有直接将参数传递给提供者方法的机制。但是,注释机制应该按照您的建议工作:

代码语言:javascript
复制
@Property
void test(@ForAll("charSequence") @Length(min = 2, max = 5)  CharSequence cs) {
    System.out.println(cs);
}

@Provide
Arbitrary<CharSequence> charSequence(TypeUsage typeUsage) {
    Optional<Length> optionalLength = typeUsage.findAnnotation(Length.class);
    int minLength = optionalLength.map(l -> l.min()).orElse(1);
    int maxLength = optionalLength.map(l -> l.max()).orElse(255);

    Arbitrary<String> stringArbitrary = Arbitraries.strings().ofMinLength(minLength).ofMaxLength(maxLength);
    Arbitrary<StringBuffer> stringBufferArbitrary =
        stringArbitrary.map(str -> null == str ? null : new StringBuffer(str));
    Arbitrary<StringBuilder> stringBuilderArbitrary =
        stringArbitrary.map(str -> null == str ? null : new StringBuilder(str));

    return Arbitraries.oneOf(
            stringArbitrary, 
            stringBufferArbitrary, 
            stringBuilderArbitrary
    );
}

我猜你忘了打开@Length的运行时保留,否则注解将被编译器删除:

代码语言:javascript
复制
@Target({ ElementType.ANNOTATION_TYPE, ElementType.PARAMETER, ElementType.TYPE_USE })
@Retention(RetentionPolicy.RUNTIME)
@interface Length {
    int min();
    int max();
}

上面的代码应该生成类似于(长度在2到5之间的序列)的输出:

代码语言:javascript
复制
ꭀ訂
쯈쓁緈ﵬ
堰⾞ᒽ뒡ՙ
ᒽ뒡
쳨任๔蔢
涼嵒퓗
⫈ࣦ᩿쯧佺
佺㺻
䲠燷怟藤
...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68943969

复制
相关文章

相似问题

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