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
相关产品推荐
相关产品推荐

