Camel测试中stub SFTP端点不遵守include选项及预期异常问题排查
问题1:stub端点未过滤文件的原因
Camel的stub组件仅提供最基础的消息转发能力,不会继承原SFTP组件的任何内置逻辑。你原路由中配置的include正则、文件校验、归档等逻辑都是SFTP组件内部实现的功能,替换为stub:前缀的端点后,所有SFTP专属的配置参数都会失效,你通过ProducerTemplate发送的所有内容都会直接进入后续路由流程,不会触发任何过滤。
问题2:多消息数预期都能通过的原因
主要有两点:
- 你直接发送File对象作为消息Body时,没有手动设置
CamelFileName消息头。原SFTP组件拉取文件时会自动生成该头,include正则的匹配逻辑完全依赖该头的值,当前路由中没有任何基于文件名的过滤逻辑,所有发送的文件都会被投递到mock端点。 - MockEndpoint的
assertIsSatisfied()方法默认有超时等待机制:如果你设置expectedMessageCount(0),断言会等待超时后统计收到的消息数为0就判定通过;如果你设置expectedMessageCount(4),只要在超时时间内收到4条消息也会判定通过。你遇到的多预期都能通过的情况,是消息路由到mock端点的时间不稳定,有时候在超时前完成投递,有时候在超时后才完成投递导致的。
无容器测试SFTP消费端点的最优方案
推荐使用Camel自带的file组件替换SFTP端点做本地测试,不需要依赖任何容器:
- 测试时通过AdviceWith把原SFTP的from端点替换为本地file端点,指向你存放测试文件的本地目录。file组件原生支持
include、move、noop等和SFTP通用的参数,可以1:1模拟SFTP的文件过滤、归档行为。 - 也可以把SFTP的文件名过滤逻辑抽成独立的Predicate,在路由中新增单独的filter步骤,这样过滤逻辑和消费组件解耦,不管用什么组件作为消费者,过滤逻辑都会生效,也方便单独做单元测试。
内容的提问来源于stack exchange,提问作者FaraBara
相关产品推荐
相关产品推荐

