Junit 如何对Spring IntegrationFlow进行单元测试?

Junit 如何对Spring IntegrationFlow进行单元测试?,junit,spring-integration,dsl,spring-annotations,Junit,Spring Integration,Dsl,Spring Annotations,我一直在使用SpringIntegrationDSL来实现一些消息处理流程 我如何才能真正对单个IntegrationFlow进行单元测试,有人能给我提供一个关于如何进行单元测试的示例吗,即转换这个bean的一部分: @Bean public IntegrationFlow transformMessage(){ return message -> message .transform(new GenericTran

我一直在使用SpringIntegrationDSL来实现一些消息处理流程

我如何才能真正对单个IntegrationFlow进行单元测试,有人能给我提供一个关于如何进行单元测试的示例吗,即转换这个bean的一部分:

@Bean
public IntegrationFlow transformMessage(){      
    return message -> message               
            .transform(new GenericTransformer<Message<String>, Message<String>>() {
                @Override
                public Message<String> transform(Message<String> message) {

                    MutableMessageHeaders headers = 
                          new MutableMessageHeaders(message.getHeaders());
                    headers.put("Content-Type", "application/json");
                    headers.put("Accept", "application/json");                      

                    String payload = "Long message";
                    ObjectMapper mapper = new ObjectMapper();

                    HashMap<String, String> map = new HashMap<>();
                    map.put("payload", payload);

                    String jsonString = null;
                    try {
                        jsonInString = mapper.writeValueAsString(map);
                    } catch (JsonProcessingException e) {
                        logger.error("Error:" + e.getMessage());                            
                    }

                    Message<String> request = new GenericMessage<String>(jsonString
                    , headers);                                     
                    return request;                 
                }
            })
            .handle(makeHttpRequestToValidateAcdrMessage())                                                     
            .enrichHeaders(h -> h.header("someHeader", "blah", true))
            .channel("entrypoint");
}
@Bean
public IntegrationFlow transformMessage(){
返回消息->消息
.transform(新的GenericTransformer(){
@凌驾
公共消息转换(消息消息){
MutableMessageHeaders=
新的MutableMessageHeaders(message.getHeaders());
headers.put(“内容类型”、“应用程序/json”);
headers.put(“接受”、“应用程序/json”);
String payload=“长消息”;
ObjectMapper mapper=新的ObjectMapper();
HashMap=newHashMap();
地图放置(“有效载荷”,有效载荷);
字符串jsonString=null;
试一试{
jsonInString=mapper.writeValueAsString(map);
}捕获(JsonProcessingException e){
logger.error(“错误:+e.getMessage());
}
消息请求=新的GenericMessage(jsonString
,标题);
返回请求;
}
})
.handle(makeHttpRequestToValidateAdrMessage())
.EnrichHeader(h->h.header(“someHeader”,“blah”,true))
.通道(“入口点”);
}
我如何测试它

问候

对我来说,“单元测试”意味着检查系统特定部分的行为,一些小组件

因此,在您的案例中,它是关于新的通用变压器

因此,只需将其作为顶级组件,并对其独立实例执行测试即可

集成测试也可以针对目标
IntegrationFlow
执行

流定义中的每个EIP组件都由
MessageChannel
s-
input
output
。即使您没有在那里声明
.channel()
,框架也会隐式构建
directchannel
,以将端点连接到流

这些隐式函数将获得如下bean名称:

channelBeanName = flowNamePrefix + "channel" +
                                BeanFactoryUtils.GENERATED_BEAN_NAME_SEPARATOR + channelNameIndex++;
因此,由于您的
IntegrationFlow
来自Lambda,因此构成
.transform()
的输入通道只是流的输入-
transformMessage.input

.transform()
和下一个
.handle()
之间的通道具有如下bean名称:
transformMessage.channel#0
,因为它将是第一个隐式通道声明

您可以将这两个通道
@Autowired
添加到您的测试用例中,并在测试之前向它们添加
ChannelInterceptor

ChannelInterceptor
可能扮演验证器的角色,以确保您向转换器发送和接收正确的数据


更多信息可在此处找到:

此处可以使用中描述的相同技术


将消息发送到通道
转换。输入
并订阅
入口点
,以获得结果(或在您的测试用例中将其更改为
队列通道

DSL IntegrationFlows测试示例已打开