此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 spring-cloud-contract 4.1.5! |
消费者驱动的合同:每个消费者的存根
在某些情况下,同一终端节点的两个使用者希望有两个不同的响应。
此方法还可以让您立即知道哪个使用者使用您 API 的哪个部分。 您可以删除 API 生成的响应的一部分,并查看哪些自动生成的测试 失败。如果没有失败,您可以安全地删除响应的该部分,因为没有人使用它。 |
考虑以下为生产者定义的合约示例,该合约名为producer
,
它有两个使用者 (foo-consumer
和bar-consumer
):
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
特征。
在创建者端,使用者可以拥有一个文件夹,其中包含仅与他们相关的协定。
通过设置stubrunner.stubs-per-consumer
flag 设置为true
,我们不再注册所有 stub,而只注册那些
对应于使用者应用程序的名称。换句话说,我们扫描每个存根的路径,然后,
如果它包含路径中具有使用者名称的子文件夹,则只有这样才会注册它。
在foo
producer 端,合约将如下所示
.
└── contracts
├── bar-consumer
│ ├── bookReturnedForBar.groovy
│ └── shouldCallBar.groovy
└── foo-consumer
├── bookReturnedForFoo.groovy
└── shouldCallFoo.groovy
这bar-consumer
consumer 可以设置spring.application.name
或stubrunner.consumer-name
自bar-consumer
或者,您可以按如下方式设置测试:
@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/…
文件夹)的 Id Broker 文件夹)。
您还可以显式设置使用者名称,如下所示:
@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/…
文件夹)的 Id Broker 文件夹)。
有关此更改背后的原因的更多信息, 参见 问题 224。