如何在不加载关联Bean的前提下测试Camel Route
针对Camel 3.8 + Spring Boot 单元测试避免MongoDB真实连接的解决方案
方案1:禁用Spring Boot MongoDB自动配置
你遇到的自动建连问题核心是Spring Boot默认会根据classpath依赖自动初始化MongoClient、MongoTemplate等Bean,和Camel侧的端点替换无关。直接在测试类的@SpringBootTest注解中排除MongoDB相关自动配置类即可,不需要创建真实MongoClient实例:@SpringBootTest( properties = {"camel.springboot.name=YourAppName"}, // 排除MongoDB自动配置,完全不会初始化真实连接相关Bean exclude = { MongoAutoConfiguration.class, MongoDataAutoConfiguration.class, MongoHealthContributorAutoConfiguration.class // 引入actuator健康检查组件时添加 } ) public class YourRouteTest { // 测试逻辑 }方案2:用MockBean覆盖MongoClient实例
如果你的业务代码中存在直接依赖MongoClient Bean的逻辑(不是仅通过Camel MongoDB组件调用),无法直接排除自动配置,可以在测试类中加@MockBean注解,直接用Mockito生成的mock对象替换Spring上下文中的真实MongoClient Bean,不会触发真实连接:@SpringBootTest public class YourRouteTest { @MockBean private MongoClient mongoClient; // 其余测试逻辑 }方案3:Camel侧全局拦截MongoDB端点调用
为了避免漏改的Camel MongoDB端点走到真实组件,可以在adviceWith阶段全局拦截所有mongodb:开头的端点,跳过原端点调用直接返回桩数据:context.adviceWith(context.getRouteDefinition("yourRouteId"), new AdviceWithRouteBuilder() { @Override public void configure() { // 拦截所有MongoDB端点请求 interceptSendToEndpoint("mongodb:*") .skipSendToOriginalEndpoint() .setBody(constant(List.of(/* 你的桩数据 */))); } });组合使用建议
优先使用方案1禁用自动配置,如有Bean依赖要求再叠加方案2,最后搭配方案3做Camel侧兜底,完全不需要修改业务代码里的端点硬编码,也不会触发真实MongoDB连接。
内容的提问来源于stack exchange,提问作者gentleben
相关产品推荐
相关产品推荐

