Spock参数匹配MarkupBuilder闭包

时间:2016-05-17 10:53:05

标签: groovy spock

我正在尝试测试一个注入了RestClient的Groovy类。

class MyService {
     def restClient

     def put() {
         restClient.put(
              path: "foo",
              contentType: "XML",
              body: { foo { bar(baz) }}
         )
     }
}

这在手动测试中可行。

我想用Spock测试它:

@TestFor(MyService)
class MyServiceSpec extends Specification {

    RESTClient restClient = Mock()

    def setup() {
        service.restClient = restClient
    }

    def "posts to restClient"() {
         when:
         service.put()

         then:
         1 * service.restClient.put([
              path: "foo",
              contentType: "XML",
              body: { foo { bar(baz) }}
         ])
    }
}

失败:Spock不考虑匹配的参数。我如何让Spock认识到他们是相同的论点?

(Grails 2.3.11)

更新:我认为问题的核心是{ foo() } == { foo() }是错误的。 How to assert equality of two closures

我看到我可以捕获Spock中的闭包,从闭包构建XML并比较XML对象。什么是简洁易懂的方法来实现这一目标?

1 个答案:

答案 0 :(得分:0)

你可以在Spock中使用_(非核心算子)来匹配“任何东西”

then:
         1 * service.restClient.put(_) 

应该可以正常工作