Spock 闭包内部的参数捕获
Argument capturing on the insides of closures in Spock
我正在尝试测试一个使用闭包进行调用的方法,如下所示:
def foo(Long param) {
AnObject.doSomething {
bar(param)
}
}
我想测试 doSomething
是通过闭包调用 bar
并在其中包含预期值的。
我可以通过创建间谍并执行
来正确测试 doSomething
调用
when:
service.foo(1L)
then:
1 * AnObject.doSomething{_}
但是,我似乎找不到对闭包内容执行断言的方法。
断言在闭包内 bar
被 1L 调用的正确方法是什么?
在没有看到更多代码的情况下,我认为您需要监视 class 提供 bar 方法。这有点做作,因为测试正在提供闭包,但我认为它是这样的:
import spock.lang.Specification
class Bar {
void bar(def param) {
println param
}
}
class DoSomethingTestSpec extends Specification {
class AnObject {
void doSomething(Closure c) {
def param = 1L
c.call(param)
}
}
def "test AnObject doSomething calls the closure"() {
given:
def closure = { def p ->
Bar.bar(p)
}
and:
GroovySpy(Bar, global:true)
and:
AnObject anObject = new AnObject()
when:
anObject.doSomething(closure)
then:
1 * Bar.bar(_) >> { args ->
assert args[0] == 1L
}
}
}
我正在尝试测试一个使用闭包进行调用的方法,如下所示:
def foo(Long param) {
AnObject.doSomething {
bar(param)
}
}
我想测试 doSomething
是通过闭包调用 bar
并在其中包含预期值的。
我可以通过创建间谍并执行
来正确测试doSomething
调用
when:
service.foo(1L)
then:
1 * AnObject.doSomething{_}
但是,我似乎找不到对闭包内容执行断言的方法。
断言在闭包内 bar
被 1L 调用的正确方法是什么?
在没有看到更多代码的情况下,我认为您需要监视 class 提供 bar 方法。这有点做作,因为测试正在提供闭包,但我认为它是这样的:
import spock.lang.Specification
class Bar {
void bar(def param) {
println param
}
}
class DoSomethingTestSpec extends Specification {
class AnObject {
void doSomething(Closure c) {
def param = 1L
c.call(param)
}
}
def "test AnObject doSomething calls the closure"() {
given:
def closure = { def p ->
Bar.bar(p)
}
and:
GroovySpy(Bar, global:true)
and:
AnObject anObject = new AnObject()
when:
anObject.doSomething(closure)
then:
1 * Bar.bar(_) >> { args ->
assert args[0] == 1L
}
}
}