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

How to unit test Spring IntegrationFlow?

我一直在使用 Spring 集成 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");
}

如何测试?

此致!

对我来说 "unit testing" 意味着检查系统特定部分的行为,一些小组件。

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

所以,只需将其作为一个 top-level 组件并针对其独立实例执行测试!

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

流定义中的每个 EIP-component 都用 MessageChannels - 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 这两个频道到您的 test-case 并在测试前添加 ChannelInterceptor 的想法。

ChannelInterceptor 可能会扮演验证者的角色,以确保您发送到转换器并从中接收到正确的数据,正如预期的那样。

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

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

向频道 transform.input 发送消息并订阅 entrypoint 以获取结果(或在您的测试用例中将其更改为 QueueChannel

DSL IntegrationFlows 测试示例在 github 上。