gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:40:36 24 4
gpt4 key购买 nike

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

代码

有许多方法都具有相同的形式。我添加了与 tail()(或 head()first() 等)相同的方法,但这只会如果列表为空,则返回 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() 进行两个测试。如果您在空列表上调用该方法,第一个测试应检查是否不会抛出异常。这很简单并且有效。我要编写的另一个测试是检查 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] -- 2Before tailIfAny()tailIfAny() list.size(): 2r: [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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com