下面的代码旨在生成随机排序的数组,并将key作为该数组的一个元素。但是我不知道问题所在,密钥不是在数组中吗?
@Provide
Arbitrary<Map<Integer, Integer[]>> llstPairs() {
// sortedArrayGenerator is generattor that return Arbitrary<Integer[]> sorted values
// and it works fine
Arbitrary<Integer[]> vals = sortedArrayGenerator();
Integer[] sample = vals.sample();
Arbitrary<Integer> key = Arbitraries.samples(sample);
return Arbitraries.maps(key,vals);
}为什么我的键不在数组中,我需要键是Integer[]数组的一个元素。
发布于 2020-02-03 17:28:02
你应该意识到的一件重要的事情是:“永远不要创建你自己的样本,让jqwik决定什么时候去做。”换句话说:Arbitrary.sample()只用于测试生成器,例如在JShell中,或者使用jqwik属性之外的生成器。
相反,您需要的是Arbitrary.flatMap()。每当需要一个生成器的结果为另一个生成器提供数据时,就需要平面映射。所以你的第一次尝试可能是:
@Provide
Arbitrary<Map<Integer, Integer[]>> llstPairs() {
Arbitrary<Integer[]> vals = sortedArrayGenerator().filter(array -> array.length > 0);
return vals.flatMap(array -> {
Arbitrary<Integer> keys = Arbitraries.of(array);
return Arbitraries.maps(keys, vals);
});
}两个旁注:
Arbitraries.sample()的javadoc!这不是你想要的,而是Arbitraries.of().但是,这并不容易,因为为map生成的数组与您用于键的数组不同。您必须确保在创建映射时使用完全相同的数组。所以你可以这样说:
@Provide
Arbitrary<Map<Integer, Integer[]>> llstPairs() {
Arbitrary<Integer[]> vals = sortedArrayGenerator().filter(array -> array.length > 0);
return vals.flatMap(array -> {
Arbitrary<Integer> keys = Arbitraries.of(array);
Arbitrary<List<Integer>> listOfKeys = keys.list();
return listOfKeys.map(lok -> {
Map<Integer, Integer[]> map = new HashMap<>();
for (Integer k : lok) {
map.put(k, array);
}
return map;
});
});
}这是相当复杂的,因为-据我所知-你并不真的需要映射,但想要一个键数组对的列表。这就是为什么我会这样做:
@Provide
Arbitrary<List<Tuple.Tuple2<Integer, Integer[]>>> listOfPairs() {
Arbitrary<Integer[]> vals = sortedArrayGenerator().filter(array -> array.length > 0);
return vals.flatMap(arrayOfInt -> {
Arbitrary<Integer> key = Arbitraries.of(arrayOfInt);
return key.map(k -> Tuple.of(k, arrayOfInt)).list();
});
}这里有一个属性来检查它是否做了它应该做的事情:
@Property(tries = 100)
void listOfPairs_keyIsInArray(@ForAll("listOfPairs") List<Tuple.Tuple2<Integer, Integer[]>> listOfPairs) {
for (Tuple.Tuple2<Integer, Integer[]> pair : listOfPairs) {
Integer key = pair.get1();
Integer[] array = pair.get2();
Assertions.assertThat(array).contains(key);
}
}https://stackoverflow.com/questions/60028612
复制相似问题