我编写了一个Groovy扩展库,为List类添加了额外的方法。我正在尝试使用Spock为此编写测试,但我无法让我的一些测试工作。
代码
有许多方法都具有相同的形式。我添加了与tail()
(或head()
,first()
等相同的方法,但如果List为空,则返回null
,而不是抛出一个例外。下面显示了一个示例(println()s用于故障排除):
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()
进行两次测试。如果在空List上调用该方法,第一个测试应该检查是否没有抛出异常。这很简单,也很有效。我想写的另一个测试是检查如果列表不为空则调用tail()
。
测试
如果List不为空,这是我检查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)
但是从stdout输出(下面)我可以看到应该调用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()
没有被调用?或者我在这里发生了什么事情?
感谢。
答案 0 :(得分:5)
从技术上讲,tail()
未在列表对象上调用(ArrayList
未声明此类方法)。因此,基于代理的Spy()
没有机会拦截呼叫。试试GroovySpy()
。