从spring cloud合同参考文档中,可以使用以下基于消息传递的合同
def contractDsl = Contract.make {
label 'some_label'
input {
messageFrom('jms:delete')
messageBody([
bookName: 'foo'
])
messageHeaders {
header('sample', 'header')
}
assertThat('bookWasDeleted()')
}
是否可以使用不是json字符串的备用消息体类型,例如,使用二进制序列化机制的有效负载?
如果是这样,是否可以使用合同测试基类中的方法返回此消息体?
答案 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),以便我们在将来的版本中不会忘记这一点。