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

时间:2014-01-04 08:02:35

标签: unit-testing groovy spock

我编写了一个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()没有被调用?或者我在这里发生了什么事情?

感谢。

1 个答案:

答案 0 :(得分:5)

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