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,以了解有关此更改背后原因的更多信息。