Spock spy注册了很少的Groovy方法的调用(无)

Dav*_*vid 2 groovy unit-testing spock

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

代码

有许多方法都具有相同的形式.我添加了与tail()(或head(),first()等)相同的方法但是null如果List为空则返回,而不是抛出异常.下面显示了一个示例(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
}
Run Code Online (Sandbox Code Playgroud)

我想要进行两项测试tailIfAny().如果在空List上调用该方法,第一个测试应该检查是否没有抛出异常.这很简单,也很有效.我想写的另一个测试是检查tail()如果列表不为空则调用.

考试

tail()如果List不为空,这是我检查调用的测试:

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()
}
Run Code Online (Sandbox Code Playgroud)

错误消息

当我运行测试时,我收到此失败消息:

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()没有被召唤?或者我在这里发生了什么事我错过了?

谢谢.

Pet*_*ser 5

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