提问者:小点点

如何单元测试Spring集成流-特别是超文本传输协议出站网关


我想知道是否有人能帮忙——这已经让我发疯好几天了!

我有一个相当简单的Spring集成文件,我想进行单元测试。SI使用超文本传输协议出站网关,我特别想进行单元测试而不是联调-我不想使用Spark或MockRestServiceServer之类的东西提供模拟超文本传输协议服务器。

我的SI配置如下所示:

<int:channel id="modifiedAttractionChannel" datatype="u.o.n.p.i.a.s.AttractionUuid">
    <int:interceptors>
        <int:wire-tap channel="attractionModifiedChannelLogging"/>
    </int:interceptors>
</int:channel>

<int-http:outbound-gateway
        id="serviceGateway" 
        request-channel="modifiedAttractionChannel"
        url="/attractions/{uuid}" 
        http-method="GET"
        expected-response-type="u.o.n.p.i.a.v.m.Attraction"
        charset="UTF-8"
        reply-timeout="${vader.reply.timeout}"
        request-factory="clientHttpRequestFactory"
        reply-channel="vaderAttractionChannel">
    <int-http:uri-variable name="uuid" expression="headers['#{T(u.o.n.p.i.a.s.AttractionsImportInitializer).HEADER_UUID}'].value" />
</int-http:outbound-gateway>

<int:channel id="attractionChannel" datatype="u.o.n.p.i.a.v.m.Attraction">
    <int:interceptors>
        <int:wire-tap channel="vaderAttractionChannelLogging"/>
    </int:interceptors>
</int:channel>

<int:logging-channel-adapter 
        id="attractionModifiedChannelLogging"
        expression="'attractionModifiedChannel: header=' + headers['#{T(u.o.n.p.i.a.s.AttractionsImportInitializer).HEADER_UUID}'].value + ', payload=' + payload" 
        level="INFO" />

<int:logging-channel-adapter 
        id="vaderAttractionChannelLogging" 
        expression="'attractionModifiedChannel: header=' + headers['#{T(u.o.n.p.i.a.s.AttractionsImportInitializer).HEADER_UUID}'].value + ', payload=' + payload" 
        level="INFO" />

我写了一个单元测试,连接了一个基本的Spring上下文,并且能够得到修改的AttractionChannel发送一个适当构建的消息,带有AttractionUuid有效负载和标头值。

我的单元测试可以断言写入attractionModifiedChannelLogging的日志消息是我所期望的(我创建了AttractionUuidMessage,所以我知道有效负载和标头值)

我现在需要做的是断言写入vaderAttractionChannelLogging窃听的值。IE。我需要断言具有给定标头值的消息-没问题,我创建了标头值作为测试的一部分-还有有效负载。

在这种情况下,有效负载是出站网关的输出。鉴于这是一个单元测试,我不想依赖于其他任何东西,我提供了一个mockClientHttpRequest estFactory,它又通过mockClientHttpRequest提供了一个mockClientHttpResponse

这工作得很好,因为我可以控制出站网关否则会收到的响应体。但是,RestTemplate调用其HttpRequest estExecutingMessageHandler,以便通过MessageConverter将响应体转换为对象

虽然这在SI流的执行方面有效,但这意味着在report-channelvaderAttractionChannel上的吸引力实例无法控制测试;因此我不能就vaderAttractionChannelLogging窃听上记录的内容做出任何断言。

我认为解决这个问题的一种方法是能够连接一个模拟或存根MessageConvertor,而不是返回一个固定景点实例的标准集。但是我一辈子都不知道怎么做!

注意:上面的场景是我实际尝试做的一个非常简化的版本。我并不是真的想围绕记录的值编写单元测试!我需要测试我的SI的整体流程,能够控制出站网关返回的景点的实例是非常关键的。

对此的任何帮助都将不胜感激;
干杯

内森


共1个答案

匿名用户

不清楚你的问题是什么;"…… RestTemplate调用它的HttpRequest estExecutingMessageHandler……"-实际上是相反的。如果您真的想对流进行单元测试,您应该提供将由标准转换器转换的模拟结果。如果您真的想模拟转换,请使用消息转换器属性。