SpringCloud 每个消费者存根
在某些情况下,同一端点的2个使用者希望有2个不同的响应。
这种方法还使您可以立即知道哪个使用者正在使用API的哪一部分。您可以删除API产生的部分响应,并且可以查看哪些自动生成的测试失败。如果没有失败,那么您可以安全地删除响应的那部分,因为没有人使用它。
让我们看下面的示例,该示例为生产者定义的合同称为producer
。有2个使用者:foo-consumer
和bar-consumer
。
消费者foo-service
request { url '/foo' method GET() } response { status OK() body( foo: "foo" } }
消费者bar-service
request { url '/foo' method GET() } response { status OK() body( bar: "bar" } }
您不能为同一请求产生2个不同的响应。因此,您可以正确打包合同,然后从stubsPerConsumer
功能中受益。
在生产者方面,消费者可以拥有一个文件夹,其中仅包含与他们相关的合同。通过将stubrunner.stubs-per-consumer
标志设置为true
,我们不再注册所有存根,而是仅注册与使用者应用程序名称相对应的存根。换句话说,我们将扫描每个存根的路径,如果它在路径中包含带有使用者名称的子文件夹,则它将被注册。
在foo
生产商一方,合同看起来像这样
. └── contracts ├── bar-consumer │ ├── bookReturnedForBar.groovy │ └── shouldCallBar.groovy └── foo-consumer ├── bookReturnedForFoo.groovy └── shouldCallFoo.groovy
作为bar-consumer
使用者,您可以将spring.application.name
或stubrunner.consumer-name
设置为bar-consumer
,也可以按以下方式设置测试:
@ContextConfiguration(classes = Config, loader = SpringBootContextLoader) @SpringBootTest(properties = ["spring.application.name=bar-consumer"]) @AutoConfigureStubRunner(ids = "org.springframework.cloud.contract.verifier.stubs:producerWithMultipleConsumers", repositoryRoot = "classpath:m2repo/repository/", stubsMode = StubRunnerProperties.StubsMode.REMOTE, stubsPerConsumer = true) class StubRunnerStubsPerConsumerSpec extends Specification { ... }
然后,仅允许引用在名称中包含bar-consumer
的路径下注册的存根(即来自src/test/resources/contracts/bar-consumer/some/contracts/…
文件夹的存根)。
或明确设置消费者名称
@ContextConfiguration(classes = Config, loader = SpringBootContextLoader) @SpringBootTest @AutoConfigureStubRunner(ids = "org.springframework.cloud.contract.verifier.stubs:producerWithMultipleConsumers", repositoryRoot = "classpath:m2repo/repository/", consumerName = "foo-consumer", stubsMode = StubRunnerProperties.StubsMode.REMOTE, stubsPerConsumer = true) class StubRunnerStubsPerConsumerWithConsumerNameSpec extends Specification { ... }
然后,仅允许引用在名称中包含foo-consumer
的路径下注册的存根(即来自src/test/resources/contracts/foo-consumer/some/contracts/…
文件夹的存根)。
您可以查看问题224,以了解有关此更改背后原因的更多信息。
更多建议: