Apache Camel中MockEndpoint.whenAnyExchangeReceived的process方法未执行问题
解决MockEndpoint.whenAnyExchangeReceived中process方法未执行的问题
嘿,我看出来你的问题了——你根本没把HTTP请求路由到MockEndpoint上,所以你的自定义处理器代码完全没被执行,Camel要么在尝试调用真实的http://abc...服务(如果不可达的话可能触发了默认回显请求的行为),要么就是直接忽略了你的Mock配置,才会返回原始请求的内容"Camel rocks"而不是你预期的响应。
下面给你一步步拆解修复方案,还有完整的可运行测试代码:
核心问题分析
你的原始测试代码里,路由还是指向真实的HTTP地址http://abc...,但你却期望MockEndpoint能拦截这个请求——这根本不可能,因为MockEndpoint只能处理发送到mock:前缀端点的请求。所以第一步必须把真实HTTP端点替换成Mock端点,再配置处理器逻辑。
修复步骤&完整代码
public class CamelMockRemoteHttpCallTest extends CamelTestSupport { @Override protected RouteBuilder createRouteBuilder() throws Exception { return new RouteBuilder() { @Override public void configure() throws Exception { // 给路由起个名字,方便后面用adviceWith修改 from("direct:start").routeId("test-http-route") .to("http://abc..."); } }; } @Test public void testMockRemoteHttpResponse() throws Exception { // 1. 用adviceWith动态替换真实HTTP端点为Mock端点 context.getRouteDefinition("test-http-route").adviceWith(context, new AdviceWithRouteBuilder() { @Override public void configure() throws Exception { // 匹配原路由中指向http://abc...的to节点,替换成mock:http-endpoint weaveByToUri("http://abc...").replace().to("mock:http-endpoint"); } }); // 2. 获取MockEndpoint实例,配置自定义响应处理器 MockEndpoint mockHttpEndpoint = getMockEndpoint("mock:http-endpoint"); mockHttpEndpoint.whenAnyExchangeReceived(exchange -> { // 设置你预期的响应内容 exchange.getMessage().setBody("Expected Body from mock remote http call"); }); // 3. 发送测试请求,获取响应 String requestContent = "Camel rocks"; String actualResponse = template.requestBody("direct:start", requestContent, String.class); // 4. 验证结果是否符合预期 assertEquals("Expected Body from mock remote http call", actualResponse); } }
关键细节说明
- adviceWith的作用:这是Camel测试里非常实用的特性,能让你在不修改生产路由代码的前提下,动态调整测试时的路由行为——这里我们用它把真实HTTP调用替换成Mock调用,完美隔离外部依赖。
- 路由命名:给路由加上
routeId能让我们更精准地定位要修改的路由,避免在复杂路由场景下出错。 - Lambda写法简化处理器:用Java Lambda替代匿名内部类,代码更简洁,可读性更高。
这样修改后,你的MockEndpoint处理器就会被正确触发,返回你预期的响应内容啦!
内容的提问来源于stack exchange,提问作者Chin Liang
相关产品推荐
相关产品推荐

