Unit testing Spock spy注册的Groovy方法调用太少(无)

Unit testing Spock spy注册的Groovy方法调用太少(无),unit-testing,groovy,spock,Unit Testing,Groovy,Spock,我编写了一个Groovy扩展库,它向List类添加了额外的方法。我正试图使用Spock为此编写测试,但我无法让我的一些测试正常工作 代码 有许多方法都具有相同的形式。我添加了与tail()(或head(),first()等)工作相同的方法,但如果列表为空,则只返回null,而不是抛出异常。下面显示了一个示例(添加println()用于故障排除): 我想对tailIfAny()进行两次测试。第一个测试应该检查如果在空列表上调用该方法,是否不会引发异常。这很简单,也很有效。我想写的另一个测试是检查如

我编写了一个Groovy扩展库,它向List类添加了额外的方法。我正试图使用Spock为此编写测试,但我无法让我的一些测试正常工作

代码

有许多方法都具有相同的形式。我添加了与
tail()
(或
head()
first()
等)工作相同的方法,但如果列表为空,则只返回
null
,而不是抛出异常。下面显示了一个示例(添加println()用于故障排除):

我想对
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()
}
有人能解释一下为什么斯波克认为没有调用
tail()
?还是这里发生了什么我不知道的事?


谢谢。

从技术上讲,列表对象上没有调用
tail()
ArrayList
没有声明这样的方法)。因此,基于代理的
Spy()
没有机会拦截调用。尝试使用
GroovySpy()

就是这样。谢谢,彼得。Groovy Mocks信息:
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) list [a, b] -- 2 Before tailIfAny() tailIfAny() list.size(): 2 r: [b] // This tells me that tail() is being called. After tailIfAny()