此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 spring-cloud-contract 4.3.0spring-doc.cadn.net.cn

如何为合约提供动态值?

与存根相关的最大挑战之一是它们的可重用性。只有能够广泛使用,才能达到其目的。 请求和响应元素的硬编码值(例如日期和 ID)通常使这变得困难。 考虑以下 JSON 请求:spring-doc.cadn.net.cn

{
    "time" : "2016-10-10 20:10:15",
    "id" : "9febab1c-6f36-4a0b-88d6-3b6a6d81cd4a",
    "body" : "foo"
}

现在考虑以下 JSON 响应:spring-doc.cadn.net.cn

{
    "time" : "2016-10-10 21:10:15",
    "id" : "c4231e1f-3ca9-48d3-b7e7-567d55f0d051",
    "body" : "bar"
}

想象一下设置适当的值所需的痛苦time字段(假设此内容是由 数据库)通过更改系统中的时钟或提供数据提供者的存根实现。同样是相关的 到id田。您可以创建 UUID 生成器的存根实现,但这样做没有什么意义。spring-doc.cadn.net.cn

因此,作为消费者,您希望发送与任何形式的时间或任何 UUID 匹配的请求。这样,您的系统 照常工作,无需存根即可生成数据。假设,在上述情况下 JSON,最重要的部分是body田。您可以专注于此并为其他领域提供匹配。换句话说, 您希望存根按如下方式工作:spring-doc.cadn.net.cn

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

就响应而言,作为消费者,您需要一个可以作的具体值。 因此,以下 JSON 有效:spring-doc.cadn.net.cn

{
    "time" : "2016-10-10 21:10:15",
    "id" : "c4231e1f-3ca9-48d3-b7e7-567d55f0d051",
    "body" : "bar"
}

在前面的部分中,我们从合约生成了测试。所以,从制片方的角度来看,情况看起来 大不相同。我们解析提供的合约,并且在测试中,我们希望向您的端点发送一个真实的请求。 因此,对于请求的生产者,我们不能进行任何形式的匹配。我们需要具体的值,其中 producer 的后端可以工作。因此,以下 JSON 将有效:spring-doc.cadn.net.cn

{
    "time" : "2016-10-10 20:10:15",
    "id" : "9febab1c-6f36-4a0b-88d6-3b6a6d81cd4a",
    "body" : "foo"
}

另一方面,从合同效力的角度来看,响应不一定非要 包含具体值timeid.假设您在生产者端生成这些。再说一遍,你 必须进行大量存根处理,以确保始终返回相同的值。这就是为什么从制作人方面来看, 您可能需要以下响应:spring-doc.cadn.net.cn

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

然后,您如何为消费者提供匹配器,为生产者提供具体值(在其他时间则相反)? Spring Cloud Contract 允许您提供动态值。这意味着两者的情况可能不同 沟通的双方。spring-doc.cadn.net.cn

您可以在合约 DSL 部分阅读有关此内容的更多信息。spring-doc.cadn.net.cn

阅读与 JSON 相关的 Groovy 文档,了解如何 正确构建请求和响应正文。