You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何更好实现覆盖所有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 20:15:41