繁体   English   中英

更好的任意数字?

[英]Better Arbitrary Number?

我需要一个任意java.lang.Number

这是我想出的:

    @Provide
    Arbitrary<Number> numbers(){
        return
        Combinators.combine(
                Arbitraries.integers().between(0, 5),
                Arbitraries.integers(),
                Arbitraries.longs(),
                Arbitraries.bigIntegers(),
                Arbitraries.floats(),
                Arbitraries.doubles(),
                Arbitraries.bigDecimals()
        ).as((i, intA, longA, bigIntegerA, floatA, doubleA, bigDecimalA) ->
          new Number[]{intA, longA, bigIntegerA, floatA, doubleA, bigDecimalA}[i]
        );
    }

这种工作,但导致

STANDARD_ERROR
10:17:38      Aug 24, 2022 2:17:38 PM net.jqwik.engine.properties.RandomizedShrinkablesGenerator logEdgeCasesOutnumberTriesIfApplicable
10:17:38      INFO: Edge case generation exceeds number of tries. Stopped after 1000 generated cases.

有没有更好的方法来实现表示java.lang.Number的所有可能值的任意值?

脚注:

为您设置理论家:

是的,我知道我正在形成一个产品并提取一个联合,这是最不有效的方法。 毫无疑问,这让收缩机无所适从。 这是我能做的最好的。 如果有办法作为一个简单的联合来做到这一点,请告诉我。

使用Arbitraries.oneOf

    @Provide
    Arbitrary<Number> numbers(){
        return Arbitraries.oneOf(
          Arbitraries.integers(),
          Arbitraries.longs(),
          Arbitraries.bigIntegers(),
          Arbitraries.floats(),
          Arbitraries.doubles(),
          Arbitraries.bigDecimals()
        );
    }

不幸的是,这仍然会导致Edge case generation exceeds number of tries警告。

有一个更简单的解决方案,因为应该生成任何有效的数字类型:

@Property
void test(@ForAll Number aNumber) {
    System.out.println(aNumber.getClass() + " = " + aNumber);
}

@Property
void test2(@ForAll("anyNumber") Number aNumber) {
    System.out.println(aNumber.getClass() + " = " + aNumber);
}

@Provide
Arbitrary<Number> anyNumber() {
    return Arbitraries.defaultFor(Number.class);
}

如您所见,尝试生成一个Number是可行的。 在底层,jqwik 检查所有已注册的与Number类型兼容的任意提供程序,并在它们之间随机选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM