【问题标题】:Does pact support consumer contract tests when consumer api calls more than one provider api当消费者 api 调用多个提供者 api 时,pact 是否支持消费者合约测试
【发布时间】:2019-09-04 05:31:24
【问题描述】:

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

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

【问题讨论】:

    标签: pact


    【解决方案1】:

    回答我上面的问题。发现我们可以用builder添加多个pact mocks。 示例

    Consumer 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)
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-20
      • 1970-01-01
      相关资源
      最近更新 更多