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

标签 unit-testing groovy spock

我编写了一个 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/

相关文章:

reactjs - 类型错误 : Cannot destructure property 'instrument' of 'options' as it is undefined

java源码与intellij中的groovy插件和gradle的兼容性

java - Spock mock - 设置和获取参数

design-patterns - 事件注册表设计模式?

c# - 命中预期异常测试结束后

c# - 如何对调用服务总线队列客户端 SendAsync 方法的类进行单元测试

javascript - 如何解释 BusterJS 测试路径中的通配符?

grails - 如何使用Spock框架编写集成测试用例

java - groovy spock 测试无法在同一包中找到 java 类

grails - 如何使用 Spock 和 Grails 2 模拟服务方法的接口(interface)参数?