[英]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
的所有可能值的任意值?
脚注:
为您设置理论家:
是的,我知道我正在形成一个产品并提取一个联合,这是最不有效的方法。 毫无疑问,这让收缩机无所适从。 这是我能做的最好的。 如果有办法作为一个简单的联合来做到这一点,请告诉我。
@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.