You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:40:50