如何在CamelSpringBootTest中CamelContext启动前Mock Apache Camel路由
如何在CamelSpringBootTest中CamelContext启动前Mock Apache Camel路由
这个场景我之前也碰到过,默认Spring Boot集成Camel时会自动启动CamelContext,导致路由的configure()方法提前执行,根本没机会在@BeforeEach里做Mock配置。下面给你一套可行的解决方案:
1. 先禁用CamelContext自动启动
最直接的方式是在测试类的@SpringBootTest注解里添加配置属性,阻止CamelContext自动启动:
@CamelSpringBootTest @SpringBootTest(properties = {"camel.springboot.auto-startup=false"}) public class MyCamelRouteTest { // 测试代码... }
这样Spring上下文初始化时,CamelContext会处于待启动状态,不会立刻执行路由的configure()方法,给你留出Mock配置的时间。
2. 在@BeforeEach中完成路由Mock配置
拿到Autowired的CamelContext后,用Camel提供的AdviceWithRouteBuilder来修改路由规则——比如替换真实业务端点为Mock端点、拦截指定处理器等。注意:这一步必须在启动CamelContext之前执行,否则路由已经初始化完成就没法修改了。
举个具体例子:
@Autowired protected CamelContext camelContext; @BeforeEach void setUp() throws Exception { // 针对指定ID的路由做Mock配置 camelContext.getRouteDefinition("my-business-route") .adviceWith(camelContext, new AdviceWithRouteBuilder() { @Override public void configure() throws Exception { // 把路由的起始端点替换为Mock用的direct端点 replaceFromWith("direct:mock-start"); // 拦截ID为"order-processor"的处理器,替换为Mock端点 weaveById("order-processor").replace().to("mock:processed-order"); } }); // 所有Mock配置完成后,手动启动CamelContext camelContext.start(); }
3. 编写测试逻辑验证Mock效果
启动CamelContext后,就可以用ProducerTemplate发送测试消息到Mock的起始端点,然后通过MockEndpoint验证消息是否按预期流转:
@Autowired protected ProducerTemplate producerTemplate; @Test void testRouteMock() throws Exception { // 发送测试消息到Mock起始端点 producerTemplate.sendBody("direct:mock-start", "test-order-data"); // 验证Mock端点是否收到消息 MockEndpoint mockEndpoint = camelContext.getEndpoint("mock:processed-order", MockEndpoint.class); mockEndpoint.expectedMessageCount(1); mockEndpoint.assertIsSatisfied(); }
额外注意点
- 一定要给你的路由设置明确的ID(比如
from("...").id("my-business-route")),否则getRouteDefinition()找不到对应的路由 - 除了用
@SpringBootTest的properties配置,也可以通过自定义CamelContextConfigurationBean来全局设置自动启动为false,适合多个测试类复用配置的场景 - 使用
AdviceWith时记得捕获异常,避免因路由ID不存在等问题导致测试失败
备注:内容来源于stack exchange,提问作者Marian Klühspies
相关产品推荐
相关产品推荐

