Apache camel camel mock-MockEndpoint.whenAnyExchangeReceived进程方法未执行
我有下面的示例代码,为什么MockEndpoint.whenAnyExchangeReceived中的流程方法没有执行 我希望响应是“来自模拟远程http调用的预期主体”,但实际响应是在请求中传递的(“驼峰”)Apache camel camel mock-MockEndpoint.whenAnyExchangeReceived进程方法未执行,apache-camel,Apache Camel,我有下面的示例代码,为什么MockEndpoint.whenAnyExchangeReceived中的流程方法没有执行 我希望响应是“来自模拟远程http调用的预期主体”,但实际响应是在请求中传递的(“驼峰”) 我在测试中添加了一些断点,似乎自动创建的模拟端点是mock://http:abc/bcd,而不是模拟:http://abc/bcd 要找到发生这种情况的原因,可以查看方法org.apache.camel.impl.InterceptSendToMockEndpointStrategy#r
我在测试中添加了一些断点,似乎自动创建的模拟端点是
mock://http:abc/bcd
,而不是模拟:http://abc/bcd
要找到发生这种情况的原因,可以查看方法org.apache.camel.impl.InterceptSendToMockEndpointStrategy#registerEndpoint
,它是模拟端点自动注册的一部分。从http URI中删除了/
。然后转到org.apache.camel.util.URISupport#normalizeUri
方法,其中为mock
uri前缀添加了/
在InterceptSendToMockEndpointStrategy
的实现中也有很好的注释,但我在文档中找不到它
//创建我们将用作拦截器的模拟端点//替换://from scheme,以便轻松查找模拟端点,而不必在uri中使用double:// 当您将其更改为
getMockEndpoint(“mock://http:abc/bcd”
,测试通过
避免这些问题的最佳方法是将
false
作为getMockEndpoint()
方法的第二个参数传递(如果您希望已经创建了端点)。如果模拟终结点不存在,这将引发异常。否则将根据需要创建新的模拟端点。谢谢您,贝德拉!在我更新了你所说的话之后,它就起作用了。@ ChinLiang,如果答案帮助你,请考虑接受它作为正确的答案并进行投票。
public class CamelMockRemoteHttpCallTest extends CamelTestSupport {
@Override
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
from("direct:start")
.to("http://abc/bcd")
;
}
};
}
@Override
public String isMockEndpointsAndSkip() {
return "http://abc/bcd";
}
@Test
public void testSimulateErrorUsingMock() throws Exception {
MockEndpoint http = getMockEndpoint("mock:http://abc/bcd");
http.whenAnyExchangeReceived(new Processor() {
public void process(Exchange exchange) throws Exception {
exchange.getOut().setBody("Expected Body from mock remote http call"); //why this line doesn't execute
}
});
String response = template.requestBody("direct:start", "Camel rocks", String.class);
assertEquals("Expected Body from mock remote http call", response); //failed, the actual response is "Camel rocks"
}
}