消费者驱动契约:每个消费者的 Stub
在某些情况下,同一端点的两个消费者希望获得两个不同的响应。
这种方法还可以让你立即知道哪个消费者使用了你 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
标志设置为 true
,我们将不再注册所有 stub,而只注册与消费者应用名称对应的 stub。换句话说,我们会扫描每个 stub 的路径,如果路径中包含消费者的子文件夹名称,那么只有这些 stub 才会被注册。
在 foo
生产者端,契约看起来像这样
.
└── contracts
├── bar-consumer
│ ├── bookReturnedForBar.groovy
│ └── shouldCallBar.groovy
└── foo-consumer
├── bookReturnedForFoo.groovy
└── shouldCallFoo.groovy
bar-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
名称的 stub(即,来自 src/test/resources/contracts/bar-consumer/some/contracts/…
文件夹的那些 stub)。
你也可以明确设置消费者名称,如下所示
@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
名称的 stub(即,来自 src/test/resources/contracts/foo-consumer/some/contracts/…
文件夹的那些 stub)。
有关此更改原因的更多信息,请参阅 问题 224。