首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用jqwik生成已排序的数字数组

如何使用jqwik生成已排序的数字数组
EN

Stack Overflow用户
提问于 2020-02-02 07:03:58
回答 1查看 561关注 0票数 2

我正在使用java jqwik进行基于属性的测试,我想生成排序数组,这是我目前为止的代码:

代码语言:javascript
复制
@Provide
Integer[] arrProvider() {
    Arbitrary<Integer> integerArbitrary = Arbitraries.integers().between(0, 100);
    Arbitrary<Integer[]> arrayArbitrary = integerArbitrary.array(Integer[].class).ofMinSize(0).ofMaxSize(30);

 // how to make my arbitrary sorted ? and I want to return it as array of Integers?
}
EN

回答 1

Stack Overflow用户

发布于 2020-02-02 16:41:00

这里有两个问题可能会让你感到头疼:

  1. 提供程序方法有哪些返回类型?
  2. 如何转换生成的对象?

让我们分两步来处理它:

在jqwik中,生成器被公开为Arbitrary<TypeToGenerate>,因此提供者方法的签名是:

代码语言:javascript
复制
@Provide
Arbitrary<Integer[]> arrProvider() {
    return ...;
}

仲裁实际上是生成器的工厂,它们提供了过滤、组合和映射的所有功能。映射是我们在问题的第二部分所需要的:

代码语言:javascript
复制
integerArbitrary
    .array(Integer[].class).ofMinSize(0).ofMaxSize(30)
    .map(anArray -> {
        Arrays.sort(anArray);
        return anArray;
    });

让我们将它们组合在一起,并在属性中使用它:

代码语言:javascript
复制
@Property
void arrayIsSorted(@ForAll("arrProvider") Integer[] array) {
    System.out.println(Arrays.toString(array));
}

@Provide
Arbitrary<Integer[]> arrProvider() {
    Arbitrary<Integer> integerArbitrary = Arbitraries.integers().between(0, 100);
    return integerArbitrary
        .array(Integer[].class).ofMinSize(0).ofMaxSize(30)
        .map(anArray -> {
            Arrays.sort(anArray);
            return anArray;
        });
}

现在,输出应该显示与此类似的排序数组:

代码语言:javascript
复制
[0, 1, 27, 33, 47, 80, 84, 91, 92]
[1, 2, 2, 5, 5, 5, 15, 16, 38, 39, 44, 54, 54, 63, 71, 78, 86, 93, 93, 100]
[0, 3, 4, 4, 4, 11, 12, 20, 21, 25, 44, 51, 55, 62, 66, 75, 78, 80, 81, 87, 90, 92, 94]
[3, 45, 45, 78, 95, 96]

只会更多。

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

https://stackoverflow.com/questions/60021840

复制
相关文章

相似问题

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