如何为合约提供动态值?
与 stub 相关的最大挑战之一是它们的可重用性。只有它们能够得到广泛使用,它们才能达到其目的。 请求和响应元素的硬编码值(例如日期和 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"
}
想象一下设置字段的适当值所需的痛苦(假设此内容由
database) 通过更改系统中的 clock 或通过提供数据提供程序的存根实现。同样是相关的
到现场。您可以创建 UUID 生成器的存根实现,但这样做几乎没有意义。time
id
因此,作为使用者,您希望发送与任何形式的时间或任何 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"
}
在前面的部分中,我们从 Contract 生成了测试。因此,从生产商的角度来看,情况看起来 大不相同。我们解析提供的 Contract,并在测试中向你的 endpoints 发送一个真实的请求。 因此,对于请求的 producer 的情况,我们不能进行任何形式的匹配。我们需要具体的值,其中 producer 的后端可以工作。因此,以下 JSON 将有效:
{
"time" : "2016-10-10 20:10:15",
"id" : "9febab1c-6f36-4a0b-88d6-3b6a6d81cd4a",
"body" : "foo"
}
另一方面,从合同有效性的角度来看,回应不一定必须
包含 或 的具体值。假设您在生产者端生成这些 API。同样,您
必须进行大量 stub 以确保始终返回相同的值。这就是为什么从制片人的角度来看,
您可能需要以下响应:time
id
{
"time" : "SOMETHING THAT MATCHES TIME",
"id" : "SOMETHING THAT MATCHES UUID",
"body" : "bar"
}
那么,您如何为消费者提供匹配器,为生产者提供具体值(在其他时间则相反)? Spring Cloud Contract 允许您提供动态值。这意味着两者可能不同 沟通的双方。
您可以在 Contract DSL 部分阅读更多相关信息。
阅读与 JSON 相关的 Groovy 文档以了解如何 正确构建请求和响应正文。 |