私は Pact も groovy も初めてです。
プロバイダーに渡す Pact を書きたいと思います。
プロバイダーは、指定されたリクエストに対して、 のような 文字列の配列で応答する必要があります["foo", "bar", "foobar"]
。
これが私の作業状態です。これは必要な部分に取り除かれていますが、まだ実行可能です:
import au.com.dius.pact.consumer.groovy.PactBuilder
import groovyx.net.http.RESTClient
import spock.lang.Specification
class MyPact extends Specification {
def "some test"() {
given:
when:
def pactBuilder = new PactBuilder()
pactBuilder {
serviceConsumer "consumer"
hasPactWith "provider"
port 1234
given('some provider state')
uponReceiving('a request')
withAttributes(method: 'get', path: '/my/endpoint')
willRespondWith(status: 200)
withBody(["foo", "bar", "foobar"])
}
pactBuilder.run() { mockServer ->
RESTClient('http://localhost:1234/').get(path: '/my/endpoint')
}
then: 1 == 1
}
}
このテストでは、次の pact ファイルが生成されます。
{
"provider": {
"name": "provider"
},
"consumer": {
"name": "consumer"
},
"interactions": [
{
"description": "a request",
"request": {
"method": "GET",
"path": "/my/endpoint"
},
"response": {
"status": 200,
"headers": {
"Content-Type": "application/json"
},
"body": [
"foo",
"bar",
"foobar"
]
},
"providerStates": [
{
"name": "some provider state"
}
]
}
],
"metadata": {
"pact-specification": {
"version": "3.0.0"
},
"pact-jvm": {
"version": "3.5.6"
}
}
}
Pact ファイルは、プロバイダーが常に次のように応答することを期待しています。["foo", "bar", "foobar"]
私が欲しいのは、文字列の汎用配列です。
次のことを試すと:
withBody {
key eachLike (3, "foo")
}
生成された Pact ファイルは次のようになります。
{
"provider": {
"name": "provider"
},
"consumer": {
"name": "consumer"
},
"interactions": [
{
"description": "a request",
"request": {
"method": "GET",
"path": "/my/endpoint"
},
"response": {
"status": 200,
"headers": {
"Content-Type": "application/json"
},
"body": {
"key": [
"foo",
"foo",
"foo"
]
},
"matchingRules": {
"body": {
"$.key": {
"matchers": [
{
"match": "type"
}
],
"combine": "AND"
}
}
}
},
"providerStates": [
{
"name": "some provider state"
}
]
}
],
"metadata": {
"pact-specification": {
"version": "3.0.0"
},
"pact-jvm": {
"version": "3.5.6"
}
}
}
matchingRules があり、これは良さそうです。しかし、ルート レベルにオブジェクトがあり、配列をルートにする必要があります。
配列をルート要素として取得し、値ではなく型で一致する文字列を取得する方法はありますか?