与Spring AMQP的Spring Cloud合同

时间:2018-07-19 10:45:29

标签: spring spring-cloud spring-amqp spring-cloud-contract

所以我一直在尝试使用Spring Cloud Contract测试RabbitListener。

到目前为止,我发现通过在合同中定义“ triggeredBy”,生成的测试将调用那里提供的方法,因此我们需要提供该方法在TestBase中的实际实现。 另一件事是“ outputMessage”,在这里我们可以验证之前发送给某些交易所的某些消息正文是否正确调用了方法。

来源:documentationsample

我的问题是,有什么办法可以从合同中产生输入消息,而不是触发自己的自定义方法? 也许类似文档中的Spring Integration或Spring Cloud Stream示例之类的东西:

Contract.make {
    name("Book Success")
    label("book_success")
    input {
        messageFrom 'input.exchange.and.maybe.route'
        messageHeaders {
            header('contentType': 'application/json')
            header('otherMessageHeader': '1')
        }
        messageBody ([
                bookData: someData
        ])
    }
    outputMessage {
        sentTo 'output.exchange.and.maybe.route'
        headers {
            header('contentType': 'application/json')
            header('otherMessageHeader': '2')
        }
        body([
                bookResult: true
        ])
    }
}

在他们的示例项目中找不到任何示例来说明如何执行此操作。

已经使用Spring Cloud Contract来记录和测试其余api服务,如果可能的话,我想通过在基于事件的服务的合同文件中定义输入和预期输出来保持一致。

1 个答案:

答案 0 :(得分:1)

没关系,实际上它已经受支持了。 出于未知原因,"Stub Runner Spring AMQP"中的文档没有像其他先前的示例一样列出该方案。

这是我的工作方式:

    Contract.make {
        name("Amqp Contract")
        label("amqp_contract")
        input {
            messageFrom 'my.exchange'
            messageHeaders {
                header('contentType': 'text/plain')
                header('amqp_receivedRoutingKey' : 'my.routing.key')
            }
            messageBody(file('request.json'))
        }
        outputMessage {
            sentTo 'your.exchange'
            headers {
                header('contentType': 'text/plain')
                header('amqp_receivedRoutingKey' : 'your.routing.key')
            }
            body(file('response.json'))
        }
    }

这将创建一个测试,该测试将基于触发处理程序方法的“ my.exchange”和“ my.routing.key”调用您的侦听器。 然后它将在RabbitTemplate调用“ your.exchange”上捕获消息和路由密钥。

    verify(this.rabbitTemplate, atLeastOnce()).send(eq(destination), routingKeyCaptor.capture(),
            messageCaptor.capture(), any(CorrelationData.class));

然后将同时声明消息和路由密钥。