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
        }
    }
}