如何让junit-quickcheck属性测试获取现有实体生成器可返回的实体集合
junit-quickcheck自定义实体列表生成解决方案
你遇到空列表的核心原因是junit-quickcheck默认的列表生成器允许生成长度为0的空集合,部分旧版本对泛型参数上的@From注解识别存在兼容问题,可按以下方案修改:
方案1(推荐,无需额外编写生成器)
在List参数上增加@Size注解指定生成列表的长度范围,同时确保测试类加上运行器注解:
import javax.validation.constraints.Size; import com.pholser.junit.quickcheck.Property; import com.pholser.junit.quickcheck.From; import com.pholser.junit.quickcheck.runner.JUnitQuickcheck; import org.junit.runner.RunWith; // 必须添加该运行器注解,否则生成器逻辑不会生效 @RunWith(JUnitQuickcheck.class) public class YourTest { @Property(trials = 5) public void addingInDiffOrderResultsInSameResult( // min指定最小长度为1即可避免空列表,max可按测试需要调整 @Size(min = 1, max = 10) List<@From(CusObjGen.class) CusObj> objs) { // 测试逻辑 } }
方案2(兼容旧版本junit-quickcheck)
如果方案1无法正确生成CusObj实例,可自定义列表生成器直接引用:
- 自定义列表生成器
import com.pholser.junit.quickcheck.generator.java.util.ListGenerator; public class CusObjListGenerator extends ListGenerator<CusObj> { public CusObjListGenerator() { // 传入你已有的单个实体生成器 super(new CusObjGen()); } }
- 测试方法引用列表生成器
@Property(trials = 5) public void addingInDiffOrderResultsInSameResult( @Size(min = 1, max = 10) @From(CusObjListGenerator.class) List<CusObj> objs) { // 测试逻辑 }
验证检查点
- 确认
CusObjGen继承com.pholser.junit.quickcheck.generator.Generator,且无参构造方法为public - 若需过滤非法实体值,优先在生成器内部实现过滤,性能优于测试方法上的
@When条件过滤
内容的提问来源于stack exchange,提问作者Kranthi
相关产品推荐
相关产品推荐

