【发布时间】:2021-07-01 12:12:43
【问题描述】:
我正在尝试 jqwik(版本 1.5.1),我从documentation 中读到,我可以创建一个Arbitrary,其生成的值取决于另一个Arbitrary 提供的值,特别是使用flatMap 函数.
我的实际目标不同,但基于这个想法:我需要 2 个Arbitrarys,它们总是为单个测试生成不同的值。这是我尝试过的:
@Provide
private Arbitrary<Tuple.Tuple2<Integer, Integer>> getValues() {
var firstArbitrary = Arbitraries.integers().between(1, Integer.MAX_VALUE);
var secondArbitrary = firstArbitrary.flatMap(first ->
Arbitraries.integers().between(1, Integer.MAX_VALUE).filter(i -> !i.equals(first)));
return Combinators.combine(firstArbitrary, secondArbitrary).as(Tuple::of);
}
@Property
public void test(@ForAll("getValues") Tuple.Tuple2<Integer, Integer> values) {
assertThat(values.get1()).isNotEqualTo(values.get2());
}
这个示例立即失败:
Shrunk Sample (1 steps)
-----------------------
arg0: (1, 1)
当然是AssertionError:
java.lang.AssertionError:
Expecting:
1
not to be equal to:
1
我预计 filter 函数足以排除 firstArbitrary 产生的生成值,但似乎它甚至没有被考虑,或者更有可能它做了其他事情。我错过了什么?有没有更简单的方法来确保给定一定数量的integer 生成器,它们总是产生不同的值?
【问题讨论】:
标签: java testing generator property-based-testing jqwik