消費者驅動契約:每個消費者的 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。