Spock 1.3模拟测试与列表作为参数的交互无法正常工作

时间:2019-04-16 18:09:05

标签: groovy spock

我想知道下面的问题是否是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开始失败,并出现完全相同的问题->在执行收集操作后,一个对象的列表变为一个空值的列表。

对不起,我无法粘贴整个代码,但希望它足够清晰,可以尝试重现它。

0 个答案:

没有答案
相关问题