Spring 云合同 - 是否可以在合同的消息正文中使用二进制负载

Spring Cloud Contract - Is it possible use a binary payload in message body of contract

根据spring云合同参考文档,以下基于消息的合同是可能的

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

是否可以使用不是 json 字符串的替代消息正文类型,例如,使用二进制序列化机制的有效载荷?

如果是这样,是否可以使用合约测试库class到return这个消息体的方法?

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

问题是,目前当您有输入/输出案例时,我们尝试直接使用正文,因为它是通过 JSON 路径将您的传入消息与您在合同中定义的内容相匹配.所以这里的二进制协议会失败(检查 org.springframework.cloud.contract.stubrunner.messaging.stream.StubRunnerStreamMessageSelector class)。我看到的另一个问题是 org.springframework.cloud.contract.stubrunner.messaging.stream.StubRunnerStreamTransformer 所以我们用来触发消息的转换器。它假定正文是一个字符串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),这样我们就不会在未来的版本中忘记这一点。