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

时间:2017-02-02 16:12:54

标签: junit spring-integration dsl spring-annotations

我一直在使用Spring Integration DSL来实现一些消息传递处理流程。

我如何实际单元测试单个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");
}

我该如何测试?

问候!

3 个答案:

答案 0 :(得分:3)

似乎对我来说&#34;单元测试&#34;意味着检查系统特定部分的行为,一些小组件。

所以,在你的情况下,它是new GenericTransformer

所以,只需将其作为顶级组件并针对其隔离的实例执行测试!

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

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

那些隐式获取bean名称如下:

channelBeanName = flowNamePrefix + "channel" +
                                BeanFactoryUtils.GENERATED_BEAN_NAME_SEPARATOR + channelNameIndex++;

因此,由于您的IntegrationFlow来自Lambda,因此.transform()的输入渠道只是流量的输入 - transformMessage.input

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

您可以@Autowired将这两个渠道ChannelInterceptor添加到测试用例中,并在测试前将ChannelInterceptor添加到其中。

$document[0].activeElement可以扮演验证角色,以确保您发送到变换器并从预期的正确数据中接收。

可以在此处找到更多信息:https://github.com/spring-projects/spring-integration-java-dsl/issues/23

答案 1 :(得分:2)

此处可以使用testing-samples project in the samples repo中描述的相同技术。

向频道entrypoint发送消息并订阅QueueChannel以获取结果(或在测试用例中将其更改为<colors> <color id='mnemonic1'>RRGGBB1</color> <color id='mnemonic2'>RRGGBB2</color> <color id='mnemonic3'>RRGGBB3</color> <color id='mnemonic4'>RRGGBB4</color> </colors>

答案 2 :(得分:0)

DSL IntegrationFlows测试示例在github