消費者驅動契約:每個消費者的存根
在某些情況下,同一端點的兩個消費者需要兩種不同的響應。
| 這種方法還可以讓您立即知道哪個消費者使用了您 API 的哪個部分。您可以刪除您的 API 產生的部分響應,然後檢視您的哪個自動生成的測試失敗了。如果沒有失敗,您可以安全地刪除該部分響應,因為沒有人使用它。 |
考慮以下為名為 producer 的生產者定義的契約示例,它有兩個消費者(foo-consumer 和 bar-consumer)
消費者
foo-servicerequest {
url '/foo'
method GET()
}
response {
status OK()
body(
foo: "foo"
}
}
消費者
bar-servicerequest {
url '/bar'
method GET()
}
response {
status OK()
body(
bar: "bar"
}
}
您不能對同一請求產生兩種不同的響應。這就是為什麼您可以正確打包契約,然後利用 stubsPerConsumer 功能。
在生產者端,消費者可以有一個資料夾,其中包含僅與他們相關的契約。透過將 spring.cloud.contract.stubrunner.stubs-per-consumer 標誌設定為 true,我們不再註冊所有存根,而只註冊與消費者應用程式名稱對應的存根。換句話說,我們掃描每個存根的路徑,如果路徑中包含一個以消費者名稱命名的子資料夾,那麼才註冊它。
在 foo 生產者端,契約將如下所示
.
└── contracts
├── bar-consumer
│ ├── bookReturnedForBar.groovy
│ └── shouldCallBar.groovy
└── foo-consumer
├── bookReturnedForFoo.groovy
└── shouldCallFoo.groovy
bar-consumer 消費者可以將 spring.application.name 或 spring.cloud.contract.stubrunner.consumer-name 設定為 bar-consumer 另外,您可以按如下方式設定測試
@SpringBootTest(classes = Config, properties = ["spring.application.name=bar-consumer",
"spring.cloud.contract.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")
@Disabled("TODO: Sth wrong with stream?")
class StubRunnerStubsPerConsumerSpec {
...
}
那麼只有在路徑中包含 bar-consumer 的名稱(即來自 src/test/resources/contracts/bar-consumer/some/contracts/… 資料夾)下注冊的存根才允許被引用。
您也可以明確設定消費者名稱,如下所示
@SpringBootTest(classes = Config, properties = "spring.cloud.contract.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")
@Disabled("TODO: Sth wrong with stream?")
class StubRunnerStubsPerConsumerWithConsumerNameSpec {
...
}
那麼只有在路徑中包含 foo-consumer 的名稱(即來自 src/test/resources/contracts/foo-consumer/some/contracts/… 資料夾)下注冊的存根才允許被引用。
有關此更改背後的更多資訊,請參閱 issue 224。