Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带某个元素的排序数组的jqwik对_Java_Property Based Testing_Jqwik - Fatal编程技术网

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);
}
}

能否显示要在其中使用地图的属性?它可能会使目的更加明确,从而指出一种或另一种发电策略。