我想知道下面的问题是否是spock错误或我做错了什么。基本上,我有一个模拟x,它具有两个接收两个列表的方法(一个是来自spring数据jpa的saveAll(),另一个是接收一个long列表)。为了简单起见,我们只关心saveAll方法中的id字段。我想知道的是为什么第一个代码段有效,而第二个代码段无效。
1 * x.saveAll(*_) >> {
assert it[0].collect {
it.id
} as Set == expected1.collect {
it.id
} as Set
}
1 * x.deleteByIdIn(*_) >> {
assert it[0] as Set == expected2.collect {
it.id
} as Set
}
请注意,在第一个断言中,为简单起见,我们将对象列表映射到ID列表,而在第二个断言中,我们已经具有ID列表。而且基本上是第二种方法的破解,因为我无法让第二种方法正常工作。
1 * x.saveAll({
it.collect {
it.id
} as Set == expected1.collect {
it.id
} as Set
})
1 * x.deleteByIdIn({
it as Set == expected2.collect {
it.id
} as Set
})
请注意,由于我们使用Spock 1.3,因此在方法的参数内部使用了clojure,这是一个隐式断言的块。根据他们的文档Argument Constraints,第二个变种是如何正确执行它并应该起作用。 我在此Spock测试中遇到的数据期望值1和期望值2为两个大小列表:0 0、1 0和0 1。 由于deleteByIdIn的0 1测试失败,因为-显然-尽管Expect2是一个项目列表,但在收集之后变成了一个null列表。
由于某种外在原因,如果我提取了给定或在哪里块中的右手集合
def x = expected1.collect {
it.id
} as Set
然后,在输入1 0上,saveAll开始失败,并出现完全相同的问题->在执行收集操作后,一个对象的列表变为一个空值的列表。
对不起,我无法粘贴整个代码,但希望它足够清晰,可以尝试重现它。