首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jqwik -任意映射-在映射中生成随机数量的条目

jqwik -任意映射-在映射中生成随机数量的条目
EN

Stack Overflow用户
提问于 2019-10-25 04:31:58
回答 1查看 195关注 0票数 1

此代码用于为元素生成单个Map条目。但我希望使用generateInputMapElements从映射中生成随机数量的条目,并将其传递给statusReturnedFromApplyingRule()

代码语言:javascript
复制
@Property
        //@Report(Reporting.GENERATED)
    boolean statusReturnedFromApplyingRule(@ForAll("generateRule") Rule rule,
                                           @ForAll("generateInputMapElements") Iterable<Map<String, Object>> elements) {
        RangeMatchRule rangeMatchRule = new RangeMatchRule();
        final RuleIF.Status status = rangeMatchRule.applyRule(rule, elements);
        return RuleIF.getEnums().contains(status.toString());
    }

    @Provide
Arbitrary<Iterable<Map<String, Object>>> generateInputMapElements() {
    Arbitrary<Double> metricValueArb = Arbitraries.doubles()
            .between(0, 50.0);

    Arbitrary<Map<String, Object>> inputMapArb =
            metricValueArb.map(metricsValue -> {
                Map<String, Object> inputMap = new HashMap<>();
                inputMap.put(Utils.METRIC_VALUE, metricsValue);
                return inputMap;
            });
    return inputMapArb.map(inputMap -> {
        List<Map<String, Object>> inputMapLst = new ArrayList<>();
        inputMapLst.add(inputMap);
        return inputMapLst;
    });
}

How to write a jqwik generator method with nested generators

EN

回答 1

Stack Overflow用户

发布于 2019-10-25 15:36:34

假设您想要一个包含单个条目的map列表(可迭代),我看到了两个基本选项。

选项1-使用Arbitrary.list()生成列表,并直接在生成器代码中指定最小和最大大小:

代码语言:javascript
复制
@Provide
Arbitrary<List<Map<String, Object>>> generateInputMapElements() {
    Arbitrary<Double> metricValueArb = Arbitraries.doubles()
                                                  .between(0, 50.0);

    return metricValueArb
        .map(metricsValue -> {
            Map<String, Object> inputMap = new HashMap<>();
            inputMap.put(Utils.METRIC_VALUE, metricsValue);
            return inputMap;
        })
        .list().ofMinSize(1).ofMaxSize(10);
}

选项2-只生成单个映射,并对可迭代对象使用标准注释:

代码语言:javascript
复制
@Property
@Report(Reporting.GENERATED)
boolean statusReturnedFromApplyingRule2(
    @ForAll("generateRule") Rule rule,
    @ForAll @Size(min = 1, max = 10) Iterable<@From("generateInputMap") Map<String, Object>> elements
) {
    ...
}

@Provide
Arbitrary<Map<String, Object>> generateInputMap() {
    Arbitrary<Double> metricValueArb = Arbitraries.doubles()
                                                  .between(0, 50.0);

    return metricValueArb
        .map(metricsValue -> {
            Map<String, Object> inputMap = new HashMap<>();
            inputMap.put(Utils.METRIC_VALUE, metricsValue);
            return inputMap;
        });
}

我个人会选择选项2,因为它需要的代码更少。不过是YMMV。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58548769

复制
相关文章

相似问题

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