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