我下面有示例代码,为什么MockEndpoint.whenAnyExchangeReceived中的进程方法没有执行?
我希望响应是"预期身体来自模拟远程http呼叫",但实际响应是请求中传递的内容(" Camel rocks")。
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"
}
}
答案 0 :(得分:0)
我在测试中添加了一些断点,似乎自动创建的模拟端点是mock://http:abc/bcd
,而不是mock:http://abc/bcd
。
要找到,为什么会发生这种情况,您可以查看方法org.apache.camel.impl.InterceptSendToMockEndpointStrategy#registerEndpoint
,它被称为模拟端点自动注册的一部分。从http URI中删除了//
。然后转到org.apache.camel.util.URISupport#normalizeUri
方法,为//
uri前缀添加了mock
。
在InterceptSendToMockEndpointStrategy
的实施中也有很好的评论,但我无法在文档中找到它。
//创建我们将用作拦截器的模拟端点
中没有double://的情况下轻松查找模拟端点
//替换://来自scheme,以便在uri
当您将其更改为getMockEndpoint("mock://http:abc/bcd")
时,测试通过。
避免这些问题的最佳方法是将false
作为getMockEndpoint()
方法的第二个参数传递,如果您希望已经创建了端点。如果模拟端点不存在,这将抛出异常。否则是按需创建的新模拟端点。