争论捕获Spock中的闭包内部

时间:2017-12-06 15:45:21

标签: unit-testing groovy spock

我正在尝试测试一个使用闭包进行调用的方法,如下所示:

dd($store)

我想测试def foo(Long param) { AnObject.doSomething { bar(param) } } 是否使用一个调用doSomething并且内部具有预期值的闭包调用。

我可以通过创建间谍并执行

来正确测试bar调用
doSomething

但是,我似乎无法找到一种方法来对闭包的内容执行断言。

使用1L调用封闭when: service.foo(1L) then: 1 * AnObject.doSomething{_} 内部的适当方法是什么?

1 个答案:

答案 0 :(得分:0)

如果没有看到更多代码,我认为您需要监视提供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
        }
    }
}