Unit testing 如何单元测试Spring集成流-特别是http出站网关

Unit testing 如何单元测试Spring集成流-特别是http出站网关,unit-testing,mockito,spring-integration,Unit Testing,Mockito,Spring Integration,我想知道是否有人能帮上忙——这已经让我发疯好几天了 我有一个相当简单的Spring集成文件,我想对其进行单元测试。SI使用http出站网关,我特别想进行单元测试而不是集成测试——我不想使用Spark或MockRestServiceServer之类的东西提供模拟http服务器 我的SI配置如下所示: <int:channel id="modifiedAttractionChannel" datatype="u.o.n.p.i.a.s.AttractionUuid"> <i

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

我有一个相当简单的Spring集成文件,我想对其进行单元测试。SI使用http出站网关,我特别想进行单元测试而不是集成测试——我不想使用Spark或MockRestServiceServer之类的东西提供模拟http服务器

我的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上下文,并且能够获得
ModifiedTractionChannel
send
一个适当构建的
消息,带有
AttractionUuid
有效负载和头值

我的单元测试可以断言写入
attractionModifiedChannel Logging
的日志消息与我预期的一样(我创建了
AttractionUuid
消息,因此我知道有效负载和头值)

我现在需要做的是断言写入
vaderAttractionChannelLogging
wiretap的值。也就是说,我需要用一个给定的头值来断言一条消息——没问题,我创建了头值作为测试的一部分——但也包括负载

在这种情况下,有效负载是出站网关的输出。考虑到这是一个单元测试,我不想依赖任何其他东西,我提供了一个mock
clienthtprequestfactory
,它通过mock
clienthtprequest
提供了一个mock
ClientHttpResponse

这非常有效,因为我可以控制出站网关将接收的响应体。但是,
restemplate
调用其
HttpRequestExecutingMessageHandler
,以便通过
MessageConverter
s将响应主体转换为对象

虽然这在SI流的执行方面起作用,但这意味着回复频道上的
吸引
实例不受测试控制;因此,我无法就
vaderAttractionChannelLogging
wiretap上记录的内容做出任何断言

我认为解决这个问题的一种方法是能够在mock或stub
MessageConvertor
中连接,而不是返回固定的
Attraction
实例的标准集。但我一辈子都不知道该怎么做

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

在此方面的任何帮助都将不胜感激
干杯


内森不清楚你的问题是什么;“…RestTemplate调用其HttpRequestExecutingMessageHandler…”-实际上是另一种方式。如果您真的想对流进行单元测试,那么应该提供模拟的正常结果,该结果将由标准转换器转换。如果您真的想模拟转换,请使用messageconverters属性

不清楚你的问题是什么;“…
restemplate
调用其
HttpRequestExecutingMessageHandler
…”——相反。如果您真的想对流进行单元测试,那么应该提供模拟的正常结果,该结果将由标准转换器转换。如果您确实想模拟转换,请使用
消息转换器
属性。谢谢Gary。在本例中,我确实希望模拟标准转换器,因为出站网关的输出对象在SI流的下游使用。您关于使用
消息转换器的建议对我很有效,因此感谢您的建议。如果你想用你的建议来回答这个问题,我很乐意把它标为公认的答案。再次感谢你;