Ich versuche, eine Groovy-Klasse zu testen, die einen injizierten RestClient hat.Spock Argument entspricht MarkupBuilder closures
class MyService {
def restClient
def put() {
restClient.put(
path: "foo",
contentType: "XML",
body: { foo { bar(baz) }}
)
}
}
Dies funktioniert OK in manuellen Tests.
Ich will es mit Spock testen:
@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) }}
])
}
}
Dies schlägt fehl: Spock nicht die Argumente prüfen zu lassen. Wie kann ich Spock erkennen lassen, dass es sich um dieselben Argumente handelt?
(Grails 2.3.11)
Update: Ich denke, der Kern des Problems ist, dass { foo() } == { foo() }
falsch ist. How to assert equality of two closures
Ich sehe, dass ich die Schließungen in Spock erfassen konnte, XML aus den Schließungen erstellen und die XML-Objekte vergleichen. Was ist eine prägnante und lesbare Möglichkeit, dies zu erreichen?