使用Spring Cloud Contract Groovy DSL,如何参数化响应以包含请求中的值?

时间:2017-01-17 15:33:06

标签: wiremock spring-cloud-contract

我正在使用Spring Cloud Contract为REST服务创建存根,因此我可以使用REST客户端进行测试。我有一个在Spring Boot应用程序中工作的存根运行器,它都按预期工作。我遇到的问题是我希望在响应中看到请求的元素,以更好地模拟REST服务的最终行为。例如,在本合同中,我希望请求中的“代码”字段中传递的内容在响应中出现反刍:

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: ???
        ])
    }
}

显然,输入“代码”可以是与正则表达式匹配的任何内容,因此实际值在运行时之前是未知的。有什么我可以代替“???”返回请求中提交的代码?我试过访问,例如:

request.body.serverValue['code']

但它似乎是在编译时生成的,也许是为了在generate-test-sources下的ContractVerifierTest.java中自动生成测试。

可以这样做吗?这是否适用于Spring Cloud Contract?

1 个答案:

答案 0 :(得分:1)

目前,它不受支持。我们更喜欢一种简化合同的方法。如果您在响应中需要来自请求的值,则只需对请求和合同的响应部分进行硬编码。

但是,您可以提出问题,我们可以尝试在将来的版本中考虑一些问题。

更新:

版本1.1.0已经可以使用了。查看文档了解更多信息 - http://cloud.spring.io/spring-cloud-static/spring-cloud-contract/1.1.0.RELEASE/#_referencing_request_from_response