如何在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
相关产品推荐
相关产品推荐

