How Can I Provide Dynamic Values to a Contract?

与存根相关的最大挑战之一是它们的重用性。只有它们得到广泛使用时,它们才能达到目标。请求和响应元素的硬编码值(例如日期和 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"
}

另一方面,从合同有效性的角度来看,响应不一定必须包含 timeid 的具体值。假设你已在生产者端生成这些值。同样,你必须执行大量存根以确保始终返回相同的值。这就是为什么从生产者的角度来看,你可能想要以下响应:

{
    "time" : "SOMETHING THAT MATCHES TIME",
    "id" : "SOMETHING THAT MATCHES UUID",
    "body" : "bar"
}

那么你可以如何为消费者提供匹配器,并为生产者提供具体值(以及在其他时间相反)?Spring Cloud Contract 让你可以提供一个动态值。这意味着它可以因通信的双方而异。

Дополнительные сведения об этом вы можете прочитать в разделе Contract DSL.

阅读 Groovy docs related to JSON 以了解如何正确构建请求和响应体。