如何更好实现覆盖所有java.lang.Number类型的Arbitrary?
解决方案
使用jqwik提供的Arbitraries.oneOf()方法直接合并多个不同类型的Arbitrary,这是实现并集的最优方案,既避免了笛卡尔积的低效问题,也能保证收缩器正常工作。
修改后的代码如下:
@Provide Arbitrary<Number> numbers() { return Arbitraries.oneOf( Arbitraries.integers(), Arbitraries.longs(), Arbitraries.bigIntegers(), Arbitraries.floats(), Arbitraries.doubles(), Arbitraries.bigDecimals() ); }
方案优势
- 高效生成:
oneOf()会随机从传入的各个Arbitrary中选取实例生成,不会像原方案的combine()那样生成所有笛卡尔积组合,大幅减少不必要的计算。 - 正常收缩:每个子
Arbitrary的收缩逻辑独立生效,不会出现原方案中收缩器混乱的问题。 - 逻辑清晰:代码直接表达了"从所有Number子类的Arbitrary中随机选取"的意图,简洁易懂。
如果需要控制不同类型的生成概率,可以使用oneOf()的重载版本,传入权重参数:
// 示例:让Integer类型的生成概率是其他类型的2倍 @Provide Arbitrary<Number> weightedNumbers() { return Arbitraries.oneOf( Tuple.of(2, Arbitraries.integers()), Tuple.of(1, Arbitraries.longs()), Tuple.of(1, Arbitraries.bigIntegers()), Tuple.of(1, Arbitraries.floats()), Tuple.of(1, Arbitraries.doubles()), Tuple.of(1, Arbitraries.bigDecimals()) ); }
内容的提问来源于stack exchange,提问作者Gabriel
相关产品推荐
相关产品推荐

