代码之家  ›  专栏  ›  技术社区  ›  Chin Liang

驼峰模拟-模拟端点。whenAnyExchangeReceived进程方法未执行

  •  3
  • Chin Liang  · 技术社区  · 6 年前

    我有下面的示例代码,为什么流程方法在MockEndpoint中。whenAnyExchangeReceived未执行?

    我希望响应是“来自模拟远程http调用的预期正文”,但实际响应是在请求中传递的(“骆驼石”)。

    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 回复  |  直到 6 年前
        1
  •  2
  •   Bedla    6 年前

    我在测试中添加了一些断点,似乎自动创建的模拟端点是 mock://http:abc/bcd mock: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() 方法,如果您希望已创建端点。如果模拟端点不存在,这将引发异常。否则将根据需要创建新的模拟端点。