此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 spring-cloud-contract 4.3.0! |
如何为合约提供动态值?
与存根相关的最大挑战之一是它们的可重用性。只有能够广泛使用,才能达到其目的。 请求和响应元素的硬编码值(例如日期和 ID)通常使这变得困难。 考虑以下 JSON 请求:
{
"time" : "2016-10-10 20:10:15",
"id" : "9febab1c-6f36-4a0b-88d6-3b6a6d81cd4a",
"body" : "foo"
}
现在考虑以下 JSON 响应:
{
"time" : "2016-10-10 21:10:15",
"id" : "c4231e1f-3ca9-48d3-b7e7-567d55f0d051",
"body" : "bar"
}
想象一下设置适当的值所需的痛苦time
字段(假设此内容是由
数据库)通过更改系统中的时钟或提供数据提供者的存根实现。同样是相关的
到id
田。您可以创建 UUID 生成器的存根实现,但这样做没有什么意义。
因此,作为消费者,您希望发送与任何形式的时间或任何 UUID 匹配的请求。这样,您的系统
照常工作,无需存根即可生成数据。假设,在上述情况下
JSON,最重要的部分是body
田。您可以专注于此并为其他领域提供匹配。换句话说,
您希望存根按如下方式工作:
{
"time" : "SOMETHING THAT MATCHES TIME",
"id" : "SOMETHING THAT MATCHES UUID",
"body" : "foo"
}
就响应而言,作为消费者,您需要一个可以作的具体值。 因此,以下 JSON 有效:
{
"time" : "2016-10-10 21:10:15",
"id" : "c4231e1f-3ca9-48d3-b7e7-567d55f0d051",
"body" : "bar"
}
在前面的部分中,我们从合约生成了测试。所以,从制片方的角度来看,情况看起来 大不相同。我们解析提供的合约,并且在测试中,我们希望向您的端点发送一个真实的请求。 因此,对于请求的生产者,我们不能进行任何形式的匹配。我们需要具体的值,其中 producer 的后端可以工作。因此,以下 JSON 将有效:
{
"time" : "2016-10-10 20:10:15",
"id" : "9febab1c-6f36-4a0b-88d6-3b6a6d81cd4a",
"body" : "foo"
}
另一方面,从合同效力的角度来看,响应不一定非要
包含具体值time
或id
.假设您在生产者端生成这些。再说一遍,你
必须进行大量存根处理,以确保始终返回相同的值。这就是为什么从制作人方面来看,
您可能需要以下响应:
{
"time" : "SOMETHING THAT MATCHES TIME",
"id" : "SOMETHING THAT MATCHES UUID",
"body" : "bar"
}
然后,您如何为消费者提供匹配器,为生产者提供具体值(在其他时间则相反)? Spring Cloud Contract 允许您提供动态值。这意味着两者的情况可能不同 沟通的双方。
您可以在合约 DSL 部分阅读有关此内容的更多信息。
阅读与 JSON 相关的 Groovy 文档,了解如何 正确构建请求和响应正文。 |