使用 Spring Cloud Contract Groovy DSL,我如何参数化响应以包含来自请求的值?
Using Spring Cloud Contract Groovy DSL, how can I parameterize the response to include values from the request?
我正在使用 Spring Cloud Contract 为 REST 服务创建存根,以便我可以使用 REST 客户端进行测试。我让存根运行器在 Spring 引导应用程序中工作,并且一切都按预期工作。我遇到的问题是我想在响应中查看请求的元素,以更好地模拟 REST 服务的最终行为。例如,在这个合同中,我希望在请求的 "code" 字段中传递的内容在响应中出现:
package contracts
org.springframework.cloud.contract.spec.Contract.make {
request {
method('POST')
url $("/resource")
body ([
code : $(client(regex('[a-zA-Z0-9]{5,32}')))
])
}
response {
status 200
body([
code: ???
])
}
}
显然输入 "code" 可以是与正则表达式匹配的任何内容,因此直到运行时才知道实际值。有什么我可以代替“???”到 return 请求中提交的代码?我尝试访问,例如:
request.body.serverValue['code']
但是这个值似乎是在编译时生成的,可能是为了在 generated-test-sources 下的 ContractVerifierTest.java 中启用测试的自动生成。
这可以做到吗?这是对 Spring Cloud Contract 的适当使用吗?
目前不支持。我们更喜欢您拥有更简单合同的方法。如果您在响应中需要来自请求的值,只需对合同的请求和响应部分进行硬编码。
但是,您可以提出问题,我们可以尝试在未来的版本中考虑一些事情。
更新:
在 1.1.0 版本中,这已经成为可能。查看文档以获取更多信息 - http://cloud.spring.io/spring-cloud-static/spring-cloud-contract/1.1.0.RELEASE/#_referencing_request_from_response
我正在使用 Spring Cloud Contract 为 REST 服务创建存根,以便我可以使用 REST 客户端进行测试。我让存根运行器在 Spring 引导应用程序中工作,并且一切都按预期工作。我遇到的问题是我想在响应中查看请求的元素,以更好地模拟 REST 服务的最终行为。例如,在这个合同中,我希望在请求的 "code" 字段中传递的内容在响应中出现:
package contracts
org.springframework.cloud.contract.spec.Contract.make {
request {
method('POST')
url $("/resource")
body ([
code : $(client(regex('[a-zA-Z0-9]{5,32}')))
])
}
response {
status 200
body([
code: ???
])
}
}
显然输入 "code" 可以是与正则表达式匹配的任何内容,因此直到运行时才知道实际值。有什么我可以代替“???”到 return 请求中提交的代码?我尝试访问,例如:
request.body.serverValue['code']
但是这个值似乎是在编译时生成的,可能是为了在 generated-test-sources 下的 ContractVerifierTest.java 中启用测试的自动生成。
这可以做到吗?这是对 Spring Cloud Contract 的适当使用吗?
目前不支持。我们更喜欢您拥有更简单合同的方法。如果您在响应中需要来自请求的值,只需对合同的请求和响应部分进行硬编码。
但是,您可以提出问题,我们可以尝试在未来的版本中考虑一些事情。
更新:
在 1.1.0 版本中,这已经成为可能。查看文档以获取更多信息 - http://cloud.spring.io/spring-cloud-static/spring-cloud-contract/1.1.0.RELEASE/#_referencing_request_from_response