Java 带某个元素的排序数组的jqwik对
下面的代码旨在生成随机排序数组,并将键作为该数组的一个元素。但我不知道问题出在哪里,钥匙不在数组中Java 带某个元素的排序数组的jqwik对,java,property-based-testing,jqwik,Java,Property Based Testing,Jqwik,下面的代码旨在生成随机排序数组,并将键作为该数组的一个元素。但我不知道问题出在哪里,钥匙不在数组中 @Provide Arbitrary<Map<Integer, Integer[]>> llstPairs() { // sortedArrayGenerator is generattor that return Arbitrary<Integer[]> sorted values // and it works fine Arbitrary&
@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);
}
@提供
任意llstPairs(){
//SorterDarrayGenerator是返回任意排序值的生成器
//而且效果很好
任意VAL=SORTERDARRAYGenerator();
整数[]样本=vals.sample();
任意键=任意数。样本(样本);
返回任意值。映射(键,VAL);
}
为什么我的键不在数组中,我需要该键是Integer[]数组的一个元素。您应该注意的一件重要事情是:“永远不要创建自己的示例。让jqwik决定何时创建。”换句话说:
任意.sample()
仅用于测试生成器,例如在JShell中,或者使用jqwik属性之外的生成器
您需要的是任意.flatMap()
。每当需要一个生成器的结果为另一个生成器提供数据时,都需要平面映射。因此,您的第一次尝试可能是:
@提供
任意llstPairs(){
任意VAL=sortedArrayGenerator().filter(数组->数组.length>0);
返回vals.flatMap(数组->{
任意键=任意数(数组);
返回任意值。映射(键、VAL);
});
}
两个旁注:
- 我过滤掉空数组,因为它们会带来问题
- 阅读javadoc获取更多信息!这不是你想要的 是的
@提供
任意llstPairs(){
任意VAL=sortedArrayGenerator().filter(数组->数组.length>0);
返回vals.flatMap(数组->{
任意键=任意数(数组);
任意listOfKeys=keys.list();
返回keys.map列表(lok->{
Map Map=newhashmap();
for(整数k:lok){
map.put(k,数组);
}
返回图;
});
});
}
这是相当复杂的,因为——据我所知——您实际上并不需要映射,而是需要一个密钥数组对列表。这就是为什么我会这么说:
@提供
任意列表{
任意VAL=sortedArrayGenerator().filter(数组->数组.length>0);
返回vals.flatMap(arrayOfInt->{
任意键=任意数(arrayOfInt);
return key.map(k->Tuple.of(k,arrayOfInt)).list();
});
}
这里有一个属性来检查它是否做了它应该做的事情:
@属性(尝试次数=100)
void listOfPairs_keyIsInArray(@ForAll(“listOfPairs”)List listOfPairs){
for(Tuple.Tuple2对:listOfPairs){
整数key=pair.get1();
整数[]数组=pair.get2();
assertThat(array).contains(key);
}
}
能否显示要在其中使用地图的属性?它可能会使目的更加明确,从而指出一种或另一种发电策略。