如何在@ForAll参数中使用其他类中定义的jqwik @Provider生成器?
jqwik跨类共享Provider生成器的解决方案
jqwik默认仅扫描当前测试类内标注了@Provide的生成器方法,跨类复用公共生成器可以通过官方提供的域(Domain)机制实现,无需手动对接冗余代码。
方案1:按需引用域(推荐,控制可见范围)
步骤1:给公共生成器类标注@Domain注解
import net.jqwik.api.Provide; import net.jqwik.api.Arbitrary; import net.jqwik.api.domains.Domain; @Domain public class MyUsefulGenerators { @Provide public Arbitrary<String> someDomainSpecificThing() { // 原有生成逻辑 } }
步骤2:在需要使用的测试类上引用该域
import net.jqwik.api.Property; import net.jqwik.api.ForAll; import net.jqwik.api.domains.Domain; // 导入对应公共生成器域,即可直接使用类内所有@Provide方法 @Domain(MyUsefulGenerators.class) public class MyTestClass { @Property void testThing(@ForAll("someDomainSpecificThing") String thing) { // 原有测试逻辑 } }
你可以根据需求在任意测试类上添加多个@Domain注解,导入不同的公共生成器类。
方案2:全局注册域(全测试集自动生效)
如果你的公共生成器需要在所有测试类中使用,不想逐个添加@Domain注解,可以通过服务注册机制全局生效:
- 在项目的测试资源目录下创建路径:
META-INF/services/net.jqwik.api.domains.DomainContextProvider - 在该文件内写入你的公共生成器类的全限定名(例如:
com.yourpackage.MyUsefulGenerators) - 所有测试类无需额外配置,即可直接使用该类下的所有
@Provide生成器。
内容的提问来源于stack exchange,提问作者I was in the neighborhood
相关产品推荐
相关产品推荐

