首页 > 解决方案 > 当消费者 api 调用多个提供者 api 时,pact 是否支持消费者合约测试

问题描述

我可以在 PACT 上找到的所有示例都有生产者 api 到消费者 api 的一对一映射。在我们的例子中,我们所有的消费者 API 都会调用多个生产者 API。

我们正在使用协议 Jvm。我们的消费者合同测试针对消费者服务运行。Producer mock 是在具有 @Pact 属性的独立函数中定义的,并且合约测试具有 @PactTestFor(pactMethod = 属性,这里“pactmockmethodname”是具有 producer mock 的函数名称。这个设置工作正常。现在,我们遇到了一个案例,我们的消费者 api 必须调用多个生产者 api。我尝试定义多个 pact 模拟,但无法将它们挂钩以进行测试,因为 @PactTestFor 属性只需要一个 pactMethod。对于这种情况,建议的方法是什么。

标签: pact

解决方案


回答我上面的问题。发现我们可以用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)
    }

推荐阅读