|
对于最新的稳定版本,请使用 spring-cloud-contract 5.0.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"
}
想象一下,设定正确的时间字段(假设该内容由数据库生成)通过改变系统中的时钟或提供数据提供者的存根实现来实现。同样的作也与相关于身份证田。 你可以创建一个 stubed 实现的 UUID 生成器,但这样做意义不大。
所以,作为消费者,你希望发送一个与任何时间形式或UUID相匹配的请求。这样,你的系统就能正常工作,生成数据而无需你手动导出任何数据。假设,对于上述JSON,最重要的是身体田。 你可以专注于这一点,并为其他字段提供匹配。换句话说,你希望存根的工作方式如下:
{
"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"
}
在前面的部分中,我们从合同中生成了测试。因此,从生产者一方来看,情况大不相同。我们解析提供的合同,在测试中,我们希望向你的端点发送一个真实请求。所以,对于请求的生产者,我们不能有任何匹配。我们需要具体的值,使得生产者的后端能够工作。因此,以下 JSON 是有效的:
{
"time" : "2016-10-10 20:10:15",
"id" : "9febab1c-6f36-4a0b-88d6-3b6a6d81cd4a",
"body" : "foo"
}
另一方面,从合同有效性的角度来看,回应不一定必须包含具体的值时间或身份证. 假设你在生产者端生成这些。同样,你必须做大量的 stubbing,以确保你总是返回相同的值。这就是为什么,从生产者那边,你可能需要以下回答:
{
"time" : "SOMETHING THAT MATCHES TIME",
"id" : "SOMETHING THAT MATCHES UUID",
"body" : "bar"
}
那么,你如何为消费者提供匹配值,为生产者提供具体价值(以及在其他时间提供相反的价值)?Spring Cloud Contract允许你提供动态价值。这意味着它可以对双方沟通双方不同。
你可以在合同DSL部分了解更多相关内容。
| 阅读与JSON相关的Groovy文档,了解如何正确地构建请求和响应主体。 |