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

如何在jqwik中复用自定义Arbitrary组合生成复杂类实例?

jqwik复用自定义Arbitrary生成复杂类型的解决方案

创建静态方法封装基础自定义Arbitrary是jqwik中复用生成器的常规且可靠方案,完全满足跨@Property方法或测试类复用的需求,具体实现如下:

1. 封装基础自定义Arbitrary为静态方法

把已有的UUID格式字符串、正整数字符串生成器封装到公共工具类的静态方法中,方便全局调用:

import net.jqwik.api.Arbitraries;
import net.jqwik.api.Arbitrary;
import java.util.UUID;

public class ArbitraryUtils {
    // 生成UUID格式字符串的自定义Arbitrary
    public static Arbitrary<String> uuidStrings() {
        return Arbitraries.create(() -> UUID.randomUUID().toString());
    }

    // 生成正整数字符串的自定义Arbitrary
    public static Arbitrary<String> positiveIntStrings() {
        return Arbitraries.integers().greaterThan(0).map(Object::toString);
    }
}

2. 基于Builder API生成复杂类Arbitrary

直接在静态方法中调用工具类的基础生成器,通过jqwik的Builder API构建Arbitrary<MyComplexClass>,可在任意测试方法或类中复用:

import net.jqwik.api.Arbitrary;
import net.jqwik.api.Builders;
import net.jqwik.api.Property;
import static org.assertj.core.api.Assertions.assertThat;

public class MyComplexClassProperties {
    // 可复用的MyComplexClass生成器
    private static Arbitrary<MyComplexClass> complexClassArbitrary() {
        return Builders.withBuilder(MyComplexClass.MyComplexClassBuilder::new)
                .set(MyComplexClass.MyComplexClassBuilder::uuid, ArbitraryUtils.uuidStrings())
                .set(MyComplexClass.MyComplexClassBuilder::positiveNum, ArbitraryUtils.positiveIntStrings())
                // 按需添加其他字段的生成器
                .build(MyComplexClass.MyComplexClassBuilder::build);
    }

    // 测试方法中直接使用该生成器
    @Property
    void validateComplexClassFields() {
        complexClassArbitrary().sample().forEach(complex -> {
            assertThat(complex.getUuid()).matches("[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}");
            assertThat(Integer.parseInt(complex.getPositiveNum())).isGreaterThan(0);
        });
    }
}

3. 无Builder时的替代方案

如果MyComplexClass没有Builder,可以用Arbitraries.combine()组合基础生成器直接创建实例:

private static Arbitrary<MyComplexClass> complexClassArbitrary() {
    return Arbitraries.combine(
            ArbitraryUtils.uuidStrings(),
            ArbitraryUtils.positiveIntStrings()
    ).as((uuid, positiveNum) -> new MyComplexClass(uuid, positiveNum));
}

这种静态方法的方式不受@ForAll、@Domain的限制,完全支持跨类复用,是当前场景下的最优方案。

内容的提问来源于stack exchange,提问作者drobert

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 11:50:34