Spring Cloud Contract - 是否可以在合同的邮件正文中使用二进制有效负载

时间:2018-06-08 09:53:38

标签: spring-cloud-contract

从spring cloud合同参考文档中,可以使用以下基于消息传递的合同

def contractDsl = Contract.make {
label 'some_label'
input {
    messageFrom('jms:delete')
    messageBody([
            bookName: 'foo'
    ])
    messageHeaders {
        header('sample', 'header')
    }
    assertThat('bookWasDeleted()')
}

是否可以使用不是json字符串的备用消息体类型,例如,使用二进制序列化机制的有效负载?

如果是这样,是否可以使用合同测试基类中的方法返回此消息体?

1 个答案:

答案 0 :(得分:0)

在Finchley中,至少对于Spring Cloud Stream支持,我们将身体转换为您从那里传递的任何字节。如果您不喜欢默认设置,那么您可以实现自己的org.springframework.cloud.contract.verifier.messaging.MessageVerifier界面,告诉我们如何发送和接收消息。这应该对生产者方面没有任何问题。不幸的是,消费者方面会出现问题:|

问题在于,当您有输入/输出大小写时,我们会尝试直接使用正文,以使您的传入消息与您通过JSON路径在合同中定义的内容相匹配。所以这里的二进制协议会失败(检查org.springframework.cloud.contract.stubrunner.messaging.stream.StubRunnerStreamMessageSelector类)。我看到的另一个问题是org.springframework.cloud.contract.stubrunner.messaging.stream.StubRunnerStreamTransformer所以我们用来触发消息的变换器。它假定body是String JSON,然后将其转换为字节。

所以简短的回答是它目前没有得到适当的支持。但是,由于Spring Cloud Contract的可插拔特性,您可以完全覆盖这些行为。您基本上可以通过属性stubrunner.stream.enabled=false禁用默认流支持,复制org.springframework.cloud.contract.stubrunner.messaging.stream包的内容,修改它以满足您的需要并注册bean。我知道这不是您希望的答案,但我已经创建了一个问题(https://github.com/spring-cloud/spring-cloud-contract/issues/664),以便我们在将来的版本中不会忘记这一点。