我想知道是否有人能帮忙——这已经让我发疯好几天了!
我有一个相当简单的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
的日志消息是我所期望的(我创建了AttractionUuid
和Message
,所以我知道有效负载和标头值)
我现在需要做的是断言写入vaderAttractionChannelLogging
窃听的值。IE。我需要断言具有给定标头值的消息-没问题,我创建了标头值作为测试的一部分-还有有效负载。
在这种情况下,有效负载是出站网关的输出。鉴于这是一个单元测试,我不想依赖于其他任何东西,我提供了一个mockClientHttpRequest estFactory
,它又通过mockClientHttpRequest
提供了一个mockClientHttpResponse
这工作得很好,因为我可以控制出站网关否则会收到的响应体。但是,RestTemplate
调用其HttpRequest estExecutingMessageHandler
,以便通过MessageConverter
将响应体转换为对象
虽然这在SI流的执行方面有效,但这意味着在report-channelvaderAttractionChannel
上的吸引力
实例无法控制测试;因此我不能就vaderAttractionChannelLogging
窃听上记录的内容做出任何断言。
我认为解决这个问题的一种方法是能够连接一个模拟或存根MessageConvertor
,而不是返回一个固定景点
实例的标准集。但是我一辈子都不知道怎么做!
注意:上面的场景是我实际尝试做的一个非常简化的版本。我并不是真的想围绕记录的值编写单元测试!我需要测试我的SI的整体流程,能够控制出站网关返回的景点
的实例是非常关键的。
对此的任何帮助都将不胜感激;
干杯
内森
不清楚你的问题是什么;"…… RestTemplate调用它的HttpRequest estExecutingMessageHandler……"-实际上是相反的。如果您真的想对流进行单元测试,您应该提供将由标准转换器转换的模拟结果。如果您真的想模拟转换,请使用消息转换器属性。