消費者驅動契約:每個消費者的 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) 才能被參照。
如需更多關於此變更背後原因的資訊,請參閱 issue 224。