Unit testing 如何单元测试Spring集成流-特别是http出站网关
我想知道是否有人能帮上忙——这已经让我发疯好几天了 我有一个相当简单的Spring集成文件,我想对其进行单元测试。SI使用http出站网关,我特别想进行单元测试而不是集成测试——我不想使用Spark或MockRestServiceServer之类的东西提供模拟http服务器 我的SI配置如下所示: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
<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的值。也就是说,我需要用一个给定的头值来断言一条消息——没问题,我创建了头值作为测试的一部分——但也包括负载
在这种情况下,有效负载是出站网关的输出。考虑到这是一个单元测试,我不想依赖任何其他东西,我提供了一个mockclienthtprequestfactory
,它通过mockclienthtprequest
提供了一个mockClientHttpResponse
这非常有效,因为我可以控制出站网关将接收的响应体。但是,restemplate
调用其HttpRequestExecutingMessageHandler
,以便通过MessageConverter
s将响应主体转换为对象
虽然这在SI流的执行方面起作用,但这意味着回复频道上的吸引
实例不受测试控制;因此,我无法就vaderAttractionChannelLogging
wiretap上记录的内容做出任何断言
我认为解决这个问题的一种方法是能够在mock或stubMessageConvertor
中连接,而不是返回固定的Attraction
实例的标准集。但我一辈子都不知道该怎么做
注意:上面的场景是我实际要做的事情的简化版本。我并不是真的试图围绕记录的值编写单元测试!我需要测试我的SI的整体流程,并且能够控制出站网关返回的景点的实例是非常关键的
在此方面的任何帮助都将不胜感激
干杯
内森不清楚你的问题是什么;“…RestTemplate调用其HttpRequestExecutingMessageHandler…”-实际上是另一种方式。如果您真的想对流进行单元测试,那么应该提供模拟的正常结果,该结果将由标准转换器转换。如果您真的想模拟转换,请使用messageconverters属性 不清楚你的问题是什么;“…restemplate
调用其HttpRequestExecutingMessageHandler
…”——相反。如果您真的想对流进行单元测试,那么应该提供模拟的正常结果,该结果将由标准转换器转换。如果您确实想模拟转换,请使用消息转换器
属性。谢谢Gary。在本例中,我确实希望模拟标准转换器,因为出站网关的输出对象在SI流的下游使用。您关于使用消息转换器的建议对我很有效,因此感谢您的建议。如果你想用你的建议来回答这个问题,我很乐意把它标为公认的答案。再次感谢你;