Spring Cloud Contract在带有正则表达式的元素的响应有效负载中返回“cursor”

时间:2018-01-26 01:59:24

标签: spring-cloud-contract

我有一个基于java的服务作为提供者,一个节点JS app作为消费者。

我在这里使用了一个存根运行器https://github.com/spring-cloud-samples/stub-runner-boot来让Node JS针对线程运行。但无论是作为客户端的Node JS,浏览器还是curl,我都会使用此“游标”文本代替正则表达式元素生成的字符串。

这是合同:

request {
    method GET()
    url value(consumer(regex('/v2/accounts/[0-9]+')))
}

response {
    status 200
    headers {
        contentType(applicationJson())
    }
    body (
            "firstName": regex('[a-zA-Z]*'),
            "lastName": regex('[a-zA-Z]*'),
            "kycStatus": regex('FAILED|PASSED|PENDING|ERROR'),
            "address": [
                    "streetAddress" : "3244 jackson street",
                    "city" : "City",
                    "state" : regex('[a-zA-Z]{2}'),
                    "zipcode": regex('^\\d{5}\$')
            ]

    )
}

这是来自wiremock的实际回复:

响应: HTTP / 1.1 200 内容类型:[application / json]

{
"firstName": {
    "cursor": 9
},
"lastName": {
    "cursor": 9
},
"kycStatus": {
    "cursor": 27
},
"address": {
    "streetAddress": "3244 jackson street",
    "city": "City",
    "state": {
        "cursor": 11
    },
    "zipcode": {
        "cursor": 7
    }
}

}

2 个答案:

答案 0 :(得分:1)

我注意到你的光标值实际上是正则表达式中的字符数。所以这告诉我一些事情肯定是错的。我以前从未遇到过这种情况。

我认为你需要用值()

包装你的正则表达式
request {
    method GET()
    url value(consumer(regex('/v2/accounts/[0-9]+')))
}

response {
    status 200
    headers {
        contentType(applicationJson())
    }
    body (
            "firstName": value(producer(regex('[a-zA-Z]*'))),
            "lastName": value(producer(regex('[a-zA-Z]*'))),
            "kycStatus": value(producer(regex('FAILED|PASSED|PENDING|ERROR'))),
            "address": [
                    "streetAddress" : "3244 jackson street",
                    "city" : "City",
                    "state" : value(producer(regex('[a-zA-Z]{2}'))),
                    "zipcode": value(producer(regex('^\\d{5}\$')))
            ]

    )
}

答案 1 :(得分:1)

我遇到了另一个示例,该示例在生成Wiremock存根时以相同的方式影响 request 负载。

如果我没有在请求正文中添加至少一个“字段”,例如:

request{
    // ...
    body (
            value(consumer(regex("[a-zA-Z0-9]+")), producer("derp"))
    )
}

要求有效负载为

{
    "cursor" : 12
}

由target / META-INF /.../ mappings / myContract.json中生成的该Wiremock存根看到

"bodyPatterns" : [ {
  "equalToJson" : "{\"cursor\":12}",
  "ignoreArrayOrder" : false,
  "ignoreExtraElements" : false
} ]

解决方案

我要做的就是在请求正文中至少添加一个字段

    body (
            aMadeUpField: value(consumer(regex("[a-zA-Z0-9]+")), producer("derp"))
    )

正则表达式现在将适用于该领域,正如我重新生成的Wiremock存根所示

"bodyPatterns" : [ {
  "matchesJsonPath" : "$[?(@.['aMadeUpField'] =~ /[a-zA-Z0-9]+/)]"
} ]

这可能就是为什么文档中隐藏一行仅显示JSON is supported for the request body的原因。

编辑:要检查的另一件事是应将“ anyBoolean()”更改为“ aBoolean()”和应将“ anInteger()”更改为“ anyInteger()”(SCC为i猜测确实与命名不一致...)。我通过ctrl +将鼠标悬停在常规方法上并确保它们返回DslProperty或ClientDslProperty,来再次检查它们在IntelliJ中是否正确

而且,正如另一位发布者所说,请确保将任何regex()与value()包装在一起,并在需要时使用consumer()和producer()。