可以将http / rest合同与amqp结合使用吗?

时间:2019-01-28 13:18:34

标签: java spring kotlin spring-cloud spring-cloud-contract

目前,我有一个带有REST API的系统,但它也将Rabbitmq消息发布到另一个系统。

目前,我有单独的groovy文件,其中包含http和amqp的合同,但我希望在一个文件中完成。也就是说,我能够检查对API的http请求/响应是否工作正常,但无法检查amqp消息是否已发布。我必须使用合同创建一个额外的常规文件,该合同使用与先前测试相同的输入将数据发送到控制器,并检查消息是否确实已发布。

所以目前我在REST部分有一个这样的常规文件:

Contract.make {
    name("http_event_with_valid_token")
    description ('A event is received with a valid token.')
    request {
        method 'POST'
        url '/events/token'
        headers {
            contentType(applicationJson())
        }
        body("""
            {
                "parameter": "value"
            }
        """)
    }
    response {
        status 202
    }
}

还有一个AMQP部分:

Contract.make {
    name("amqp_event_with_valid_token")
    description( "A event is received with a valid token.")
    input {
        triggeredBy('controller.event("token", "{\\"parameter\\":\\"value\\"}")')
    }
    outputMessage {
        sentTo 'exchange.events.events'
        body("""
            {
                "parameter": "value"
            }
        """)
        headers {
            header('token': 'token')
        }
    }
}

我想在一个常规文件中进行两项检查,而不生成两个单独的测试。这可能吗?

1 个答案:

答案 0 :(得分:0)

如果您想使用带有参数的单个测试/测试套件,那么我建议您阅读[Spock Framework][1]。它使您可以使用多个参数(即参数)执行相同的测试。

您可能需要为此稍微更改代码,但示例如下所示:

class HelloSpockSpec extends Specification {
  def "length of Spock's and his friends' names"() {
    expect:
    name.size() == length

    where:
    name     | length
    "Spock"  | 5
    "Kirk"   | 4
    "Scotty" | 6
  }
}

您可以定义合同的多个元素,保持结构不变,并在有问题的定义的常规文件中检查响应状态(例如,您可以通过参数传递名称,描述,请求)。

Here是一些示例。