如何使用sping-contract定义消息传递和http API的合同

时间:2018-04-12 07:48:38

标签: spring-cloud spring-cloud-contract

我有两种服务的情况。服务A通过HTTP端点公开查询API,并且还在侦听包含异步命令消息(服务A拥有两个CQRS合同)。

服务B使用服务A的两个端点:GET数据和调用命令。

虽然为HTTP流程实现合同(存根和测试)非常简单,但配置消息传递部分对我来说是一个棘手的问题,实际上我已经坚持了这一点。

文档说,发布商方测试生成适合发布出版商拥有合同的事件案例。

但是如何让它适用于消息消费者拥有合同的情况?

我无法找到任何解决方案,因为我需要在服务A中使用存根来验证服务A是否正确消耗命令消息,而且我还需要在服务B上进行基因处理测试以验证服务B,如果它正在生成兼容的命令消息。

我很感激任何帮助。

非常感谢提前。

1 个答案:

答案 0 :(得分:0)

服务A是API的生产者和消息的使用者。它只拥有HTTP合同。消息传递合同由服务B拥有。服务B是消息的生产者。您应该在服务A端定义HTTP合同,并使用Stub Runner测试来测试它是否可以接收服务B发送的消息。服务B应该具有消息传递合同以断言消息是否正确发送并且Stub Runner测试HTTP

这可能会导致依赖性循环。如果你的应用程序之间有一个循环那么,是的,你要做的就是忽略一边的存根运行器测试,直到罐子上传。

您已经询问过将合同存储在单独的存储库中。你可以这样做 - 这里是文档https://cloud.spring.io/spring-cloud-static/Edgware.SR3/multi/multi__spring_cloud_contract_faq.html#_common_repo_with_contracts,这是一个例子https://github.com/spring-cloud-samples/spring-cloud-contract-samples/tree/master/beer_contracts

你已经问过由于某些原因没有生成测试(IMO这是错误的事情)。您不能在Maven中使用<extensions>true</extensions>,而是手动提供您要执行的目标(省略测试生成)。在Gradle中,只需停用generateContractTests任务AFAIR

即可