如何为契约提供动态值?
与存根相关最大的挑战之一是其可重用性。只有当它们被广泛使用时,它们才能发挥其作用。请求和响应元素的硬编码值(例如日期和 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 部分阅读更多相关信息。
| 阅读 Groovy JSON 相关文档 以了解如何正确构建请求和响应体。 |