如何对 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 都用
MessageChannel
s - input
和 output
。即使您没有在那里声明 .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 上。
我一直在使用 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 都用
MessageChannel
s - input
和 output
。即使您没有在那里声明 .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 上。