此版本仍在开发中,目前尚不被视为稳定版本。如需最新稳定版本,请使用 spring-cloud-contract 5.0.2spring-doc.cadn.net.cn

消费者驱动契约:每个消费者对应的存根

存在这样的情况:两个同一端点的消费者希望获得两种不同的响应。spring-doc.cadn.net.cn

这种方法还能让您立即了解哪个消费者使用了您 API 的哪一部分。</p><p>您可以移除 API 生成的响应中的某一部分,然后查看哪些自动生成的测试用例失败。如果没有任何测试用例失败,那么您可以安全地删除该响应部分,因为没有用户在使用它。

考虑以下为名为 producer 的生产者所定义的契约示例,该生产者有两个消费者(foo-consumerbar-consumer):spring-doc.cadn.net.cn

消费者 foo-service
request {
   url '/foo'
   method GET()
}
response {
    status OK()
    body(
       foo: "foo"
    }
}
消费者 bar-service
request {
   url '/bar'
   method GET()
}
response {
    status OK()
    body(
       bar: "bar"
    }
}

您无法为同一请求生成两种不同的响应。这就是为什么您可以正确打包契约,然后利用 stubsPerConsumer 功能获利。spring-doc.cadn.net.cn

在生产者端,消费者可以拥有一个仅包含与其相关的契约的文件夹。spring-doc.cadn.net.cn

spring-doc.cadn.net.cn

通过将 stubrunner.stubs-per-consumer 标志设置为 true,我们不再注册所有存根(stubs),而仅注册那些与消费者应用程序名称相匹配的存根。换句话说,我们扫描每个存根的路径,如果该路径中包含以消费者名称命名的子文件夹,则仅在此情况下才进行注册。spring-doc.cadn.net.cn

spring-doc.cadn.net.cn

foo 生产者端,契约将如下所示spring-doc.cadn.net.cn

.
└── contracts
    ├── bar-consumer
    │   ├── bookReturnedForBar.groovy
    │   └── shouldCallBar.groovy
    └── foo-consumer
        ├── bookReturnedForFoo.groovy
        └── shouldCallFoo.groovy

消费者 bar-consumer 可以设置 spring.application.namestubrunner.consumer-namebar-consumer
或者,您可以按如下方式设置测试:spring-doc.cadn.net.cn

@SpringBootTest(classes = Config, properties = ["spring.application.name=bar-consumer",
		"stubrunner.jms.enabled=false"])
@AutoConfigureStubRunner(ids = "org.springframework.cloud.contract.verifier.stubs:producerWithMultipleConsumers",
		repositoryRoot = "classpath:m2repo/repository/",
		stubsMode = StubRunnerProperties.StubsMode.REMOTE,
		stubsPerConsumer = true)
@ActiveProfiles("streamconsumer")
class StubRunnerStubsPerConsumerSpec {
...
}

然后,只有在路径名称中包含 bar-consumer 的存根(即来自 src/test/resources/contracts/bar-consumer/some/contracts/…​ 文件夹的存根)才被允许引用。spring-doc.cadn.net.cn

你也可以显式地设置消费者名称,如下所示:spring-doc.cadn.net.cn

@SpringBootTest(classes = Config, properties = "stubrunner.jms.enabled=false")
@AutoConfigureStubRunner(ids = "org.springframework.cloud.contract.verifier.stubs:producerWithMultipleConsumers",
        repositoryRoot = "classpath:m2repo/repository/",
        consumerName = "foo-consumer",
        stubsMode = StubRunnerProperties.StubsMode.REMOTE,
        stubsPerConsumer = true)
@ActiveProfiles("streamconsumer")
class StubRunnerStubsPerConsumerWithConsumerNameSpec {
...
}

然后,只有在路径中包含数字 foo-consumer 的那些存根(即来自 src/test/resources/contracts/foo-consumer/some/contracts/…​ 文件夹的存根)才被允许引用。spring-doc.cadn.net.cn

有关此更改原因的更多信息,请参阅 问题 224spring-doc.cadn.net.cn