对于最新的稳定版本,请使用 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"
}
在前面的章节中,我们从合约中生成了测试。因此,从生产者方面来看,情况看起来大不相同。我们解析提供的合约,在测试中,我们希望向您的端点发送一个真实的请求。因此,对于请求的生产者,我们不能进行任何形式的匹配。我们需要具体的值,以便生产者的后端可以工作。因此,以下 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 文档,了解如何正确构建请求和响应正文。 |