camel mock - MockEndpoint.whenAnyExchangeReceived进程方法不执行

时间:2018-05-06 15:49:23

标签: apache-camel

我下面有示例代码,为什么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"
    }
}

1 个答案:

答案 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的实施中也有很好的评论,但我无法在文档中找到它。

  

//创建我们将用作拦截器的模拟端点
  //替换://来自scheme,以便在uri

中没有double://的情况下轻松查找模拟端点

当您将其更改为getMockEndpoint("mock://http:abc/bcd")时,测试通过。

避免这些问题的最佳方法是将false作为getMockEndpoint()方法的第二个参数传递,如果您希望已经创建了端点。如果模拟端点不存在,这将抛出异常。否则是按需创建的新模拟端点。