【问题标题】:Spring Cloud Contract with Spring AMQPSpring Cloud Contract 与 Spring AMQP
【发布时间】:2018-12-27 11:21:07
【问题描述】:

所以我一直在尝试使用 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 来记录和测试 rest api 服务,如果可能的话,我希望通过在基于事件的服务的合同文件中定义输入和预期输出来保持一致。

【问题讨论】:

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


    【解决方案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));
    

    然后消息和路由键都将被断言。

    【讨论】:

    • 抱歉文档中缺少条目!你能把你所做的事情提交一份 PR 吗?
    • 嗨@MarcinGrzejszczak,您是指对spring-cloud-contract-samples 还是文档的PR?因为我实际上并没有在 spring-cloud-contract 本身上添加/更改任何内容。
    • 我已经更新了文档。 sc合同样本中的样本会很方便
    • 好的,有时可能需要,但我会尝试在那里提交 PR。
    猜你喜欢
    • 2017-02-15
    • 2020-10-24
    • 1970-01-01
    • 2016-11-23
    • 2017-02-17
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    • 2022-10-17
    相关资源
    最近更新 更多