我编写了一个 Groovy 扩展库,它向 List 类添加了额外的方法。我正在尝试使用 Spock 为此编写测试,但我无法让我的一些测试正常工作。
代码
有许多方法都具有相同的形式。我添加了与 tail()
(或 head()
、first()
等)相同的方法,但这只是如果列表为空,则返回 null,而不是抛出异常。下面显示了一个示例(添加了 println() 用于故障排除):
public static def tailIfAny(List list) {
println "tailIfAny() list.size(): ${list.size()}"
def r = list.size() ? list.tail() : null
println "r: $r"
return r
}
我想对 tailIfAny()
进行两次测试。第一个测试应该检查如果在空列表上调用该方法是否不会引发异常。这很简单并且有效。我想编写的另一个测试是检查如果列表不为空,是否调用 tail()
。
测试
这是我的测试,用于检查列表不为空时是否调用 tail()
:
def "tailIfAny() calls tail()"() {
setup:
def list = Spy(ArrayList)
list << 'a'
list << 'b'
when:
println "list ${list} -- ${list.size()}"
println "Before tailIfAny()"
list.tailIfAny()
println "After tailIfAny()"
then:
1 * list.tail()
}
错误消息
当我运行测试时,我收到此失败消息:
Too few invocations for: 1 * list.tail() (0 invocations) Unmatched invocations (ordered by similarity): 1 * list.toArray() 1 * list.iterator() 3 * list.size() 1 * list.isEmpty() at org.spockframework.mock.runtime.InteractionScope.verifyInteractions(InteractionScope.java:78) at org.spockframework.mock.runtime.MockController.leaveScope(MockController.java:76) at com.fgi.extensions.ListExtensionsTests.add element in setup(ListExtensionsTests.groovy:65)
但是从标准输出输出(如下)我可以看到应该调用 tail()
。
测试得出的标准
list [a, b] -- 2 Before tailIfAny() tailIfAny() list.size(): 2 r: [b] // This tells me that tail() is being called. After tailIfAny()
有人能解释一下为什么 Spock 认为 tail()
没有被调用吗?或者这里发生了什么我错过的事情?
谢谢。
最佳答案
从技术上讲,tail()
不会在列表对象上调用(ArrayList
没有声明这样的方法)。因此,基于代理的 Spy()
没有机会拦截调用。尝试使用 GroovySpy()
。
关于unit-testing - Spock spy 注册的 Groovy 方法调用太少(无),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20918529/