SpringCloud 每個(gè)消費(fèi)者存根

2023-12-11 17:27 更新

在某些情況下,同一端點(diǎn)的2個(gè)使用者希望有2個(gè)不同的響應(yīng)。

 這種方法還使您可以立即知道哪個(gè)使用者正在使用API??的哪一部分。您可以刪除API產(chǎn)生的部分響應(yīng),并且可以查看哪些自動(dòng)生成的測(cè)試失敗。如果沒有失敗,那么您可以安全地刪除響應(yīng)的那部分,因?yàn)闆]有人使用它。

讓我們看下面的示例,該示例為生產(chǎn)者定義的合同稱為producer。有2個(gè)使用者:foo-consumerbar-consumer。

消費(fèi)者foo-service

request {
   url '/foo'
   method GET()
}
response {
    status OK()
    body(
       foo: "foo"
    }
}

消費(fèi)者bar-service

request {
   url '/foo'
   method GET()
}
response {
    status OK()
    body(
       bar: "bar"
    }
}

您不能為同一請(qǐng)求產(chǎn)生2個(gè)不同的響應(yīng)。因此,您可以正確打包合同,然后從stubsPerConsumer功能中受益。

在生產(chǎn)者方面,消費(fèi)者可以擁有一個(gè)文件夾,其中僅包含與他們相關(guān)的合同。通過將stubrunner.stubs-per-consumer標(biāo)志設(shè)置為true,我們不再注冊(cè)所有存根,而是僅注冊(cè)與使用者應(yīng)用程序名稱相對(duì)應(yīng)的存根。換句話說,我們將掃描每個(gè)存根的路徑,如果它在路徑中包含帶有使用者名稱的子文件夾,則它將被注冊(cè)。

foo生產(chǎn)商一方,合同看起來像這樣

.
└── contracts
    ├── bar-consumer
    │   ├── bookReturnedForBar.groovy
    │   └── shouldCallBar.groovy
    └── foo-consumer
        ├── bookReturnedForFoo.groovy
        └── shouldCallFoo.groovy

作為bar-consumer使用者,您可以將spring.application.namestubrunner.consumer-name設(shè)置為bar-consumer,也可以按以下方式設(shè)置測(cè)試:

@ContextConfiguration(classes = Config, loader = SpringBootContextLoader)
@SpringBootTest(properties = ["spring.application.name=bar-consumer"])
@AutoConfigureStubRunner(ids = "org.springframework.cloud.contract.verifier.stubs:producerWithMultipleConsumers",
		repositoryRoot = "classpath:m2repo/repository/",
		stubsMode = StubRunnerProperties.StubsMode.REMOTE,
		stubsPerConsumer = true)
class StubRunnerStubsPerConsumerSpec extends Specification {
...
}

然后,僅允許引用在名稱中包含bar-consumer的路徑下注冊(cè)的存根(即來自src/test/resources/contracts/bar-consumer/some/contracts/…?文件夾的存根)。

或明確設(shè)置消費(fèi)者名稱

@ContextConfiguration(classes = Config, loader = SpringBootContextLoader)
@SpringBootTest
@AutoConfigureStubRunner(ids = "org.springframework.cloud.contract.verifier.stubs:producerWithMultipleConsumers",
		repositoryRoot = "classpath:m2repo/repository/",
		consumerName = "foo-consumer",
		stubsMode = StubRunnerProperties.StubsMode.REMOTE,
		stubsPerConsumer = true)
class StubRunnerStubsPerConsumerWithConsumerNameSpec extends Specification {
...
}

然后,僅允許引用在名稱中包含foo-consumer的路徑下注冊(cè)的存根(即來自src/test/resources/contracts/foo-consumer/some/contracts/…?文件夾的存根)。

您可以查看問題224,以了解有關(guān)此更改背后原因的更多信息。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)