我想用Spock Groovy测试我的Java服务,这个服务有点棘手,因为方法调用返回一个值,并且还会更改传递给该方法的变量的内容。
由于我想模拟此方法调用,因此我需要以某种方式告诉 Spock,当执行该方法时,返回一个特定值并更改传递变量的内容。
像这样:
given: "list with one element"
List<String> list = ["mock"]
when: "executing the service call"
service.execute(list)
then: "external method is called, which updates the passed variable and returns true as success"
1 * external.addOneMoreToList(list) >> true
and: "list is updated successfully"
list.size == 2
list.get(1) == "mock 2"
但是我不知道在哪里以及如何通过添加下一个元素来更新列表:"mock 2"。
我知道这个例子没有意义,但我不想写我真正的测试用例,因为它很大,但我需要类似的临时更新
使用闭包而不是简单的交互值,如下所示:
1 * external.addOneMoreToList(list) >> { list ->
list << 'mock 2'
return true
}
一些惯用语:
在这种情况下实际上没有必要
return true
,因为(假设您的返回类型是boolean
(Groovy 会认为非空列表是真实的。明确还是个好主意。与 JUnit 一样,期望值排在第一位,然后是实际值 (
2 == list.size()
(。您可以使用
[]
:'mock 2' == list[1]
索引到List
中。最好尽可能使用随机值,例如
'mock 2'
值,因为这有助于防止意外传递。您可以在given
块中设置变量并在交互中使用它们;我通常使用 commons-lang3RandomStringUtils
。
并尝试将测试用例精简到任何实用程度!Spock 的友好交互模拟使得对可能过于复杂的接口使用测试替身变得不那么痛苦,并且扩展交互可以成为@Stepwise
的合理用例(我已经将其用于具有多步骤场景的 Selenium 测试(。