pact - 当消费者 api 调用多个提供者 api 时,pact 是否支持消费者合约测试
问题描述
我可以在 PACT 上找到的所有示例都有生产者 api 到消费者 api 的一对一映射。在我们的例子中,我们所有的消费者 API 都会调用多个生产者 API。
我们正在使用协议 Jvm。我们的消费者合同测试针对消费者服务运行。Producer mock 是在具有 @Pact 属性的独立函数中定义的,并且合约测试具有 @PactTestFor(pactMethod = 属性,这里“pactmockmethodname”是具有 producer mock 的函数名称。这个设置工作正常。现在,我们遇到了一个案例,我们的消费者 api 必须调用多个生产者 api。我尝试定义多个 pact 模拟,但无法将它们挂钩以进行测试,因为 @PactTestFor 属性只需要一个 pactMethod。对于这种情况,建议的方法是什么。
解决方案
回答我上面的问题。发现我们可以用builder添加多个pact mocks。例子
消费者 API 调用两个生产者方法 /user/1 和 /user/account/1 我们可以定义 pact mock 如下。
@Pact(consumer = "CONSUMER") fun getUser(builder: PactDslWithProvider): RequestResponsePact { return builder .uponReceiving("get user basic info request") .path("/user/1") ....... // define response status code and body as required .uponReceiving("get user account info request") .path("/user/account/1") ...... // define response status code and body as required .toPact() }
消费者合同测试可以如下
@Test @PactTestFor(pactMethod = "getUser") fun `should respond with user info`() { // consumer api call val result = restTemplate.getForEntity("/customers/1",String::class.java) val expected = ... // have expected here assertEquals(HttpStatus.OK, result.statusCode) assertEquals(expected, result.body, false) }
推荐阅读
- html - 我可以将 VBA 用户表单嵌入到 html 中的网站中吗?
- javascript - 如何在 IBM Carbon Design(Angular) 的 TableItem 中使用输入文本框?
- checksum - 如何修复 modbus 中的校验和错误
- java - 在运行时在android中更改所有屏幕方向
- loopbackjs - lb3app 中的 socket.io 安装在 lb4 中的应用程序(环回)
- fullcalendar - Fullcalendar 4:如何在 fullcalendar 上获取已删除事件的元素引用?
- c# - 如何在 Angular 和 C# 中编写 post 方法?
- asynchronous - Flutter 动态标签栏渲染(异步)
- java - 在注入的类中注入一个接口的不同实现
- angular - 角度导航到具有多个参数的路由