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

Apache Camel HTTP Mock测试遇Connection refused,求排查方案

问题分析与解决方案

首先得戳破这个核心误区:你用的MockRestServiceServer只能拦截Spring RestTemplate发起的请求,但Apache Camel的http组件是靠自己的HTTP客户端(默认是Apache HttpClient)直接发请求到目标地址,完全和RestTemplate不搭边——所以你的Mock服务器根本没接住Camel的请求,自然会出现连接拒绝,因为127.0.0.1:8088上压根没跑真实服务。

为什么会踩这个坑?

  • MockRestServiceServer是Spring Test的工具,它的玩法是替换RestTemplate内部的请求工厂,把RestTemplate的请求拦下来返回预设响应。
  • 但Camel的http/http4组件是独立实现的HTTP客户端,和RestTemplate没有半毛钱关系,它会直接尝试连真实的8088端口,没服务监听就炸了。

正确Mock Camel HTTP调用的两种方案

根据你的测试场景,推荐两种靠谱的做法:

1. 用Camel自带的Mock组件直接替换HTTP端点

测试时把路由里的HTTP地址换成mock:external-service,然后直接给这个Mock端点设置响应就行,简单直接:

// 测试环境下修改路由
from("direct:start")
    .setHeader(Exchange.HTTP_METHOD, constant("GET"))
    .to("mock:external-service")
    .to("mock:result");

// 在测试代码里配置Mock的响应逻辑
MockEndpoint mockExternal = context.getEndpoint("mock:external-service", MockEndpoint.class);
mockExternal.whenAnyExchangeReceived(exchange -> {
    exchange.getIn().setBody("");
    exchange.getIn().setHeader(Exchange.HTTP_RESPONSE_CODE, 200);
    exchange.getIn().setHeader(Exchange.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
});

2. 用真实的轻量HTTP Mock服务器(比如WireMock)

如果需要更贴近真实场景的校验(比如验证请求头、URL参数这些细节),可以用WireMock启动一个临时的HTTP服务监听8088端口,这样你的原路由不用改,请求会被WireMock接住:

// 测试类里初始化WireMock
@Rule
public WireMockRule wireMockRule = new WireMockRule(8088);

// 测试方法里设置Mock响应
wireMockRule.stubFor(get(urlEqualTo("/"))
    .willReturn(aResponse()
        .withStatus(200)
        .withHeader("Content-Type", MediaType.APPLICATION_JSON_VALUE)
        .withBody("")));

额外排查小技巧

要是你还想确认问题根源,可以做这两步:

  • 用telnet 127.0.0.1 8088或者curl http://127.0.0.1:8088/测一下端口——如果返回连接拒绝,说明确实没服务在跑,你的Mock没起作用。
  • 别纠结RestTemplate的配置了,Camel根本不用它,所以MockRestServiceServer对Camel的请求完全无效。

内容的提问来源于stack exchange,提问作者Roar Skullestad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:24:08