在骆驼测试中进行 bean 注入

Doing bean inject in camel test

我有一个 camel 应用程序,看起来像下面的样子,它有如下的路线:-

从("direct:getMarketplaceOrders").到("bean:orderHelper?method=getMarketplaceOrders");

代码的入口点如下所示:

public class OrderMainApp {
    public static void main(String... args) throws Exception {
    OrderMainApp orderMainApp = new OrderMainApp();
    DefaultCamelContext camelContext = new DefaultCamelContext();
    ProducerTemplate producer = camelContext.createProducerTemplate();
    camelContext.setRegistry(orderMainApp.createRegistry(producer));
    camelContext.addRoutes(new OrderRouteBuilder(producer));
    camelContext.start();
    }

    protected JndiRegistry createRegistry(ProducerTemplate producer) throws Exception {
    JndiRegistry jndi = new JndiRegistry();
    OrderHelper orderHelper = new OrderHelper();
    orderHelper.setProducer(producer);
    jndi.bind("orderHelper", orderHelper);
    return jndi;
    }
}

OrderRouteBuilder configure 中有如下路线:-

//processor is a custom JSONProcessor extending Processor
from("jetty:http://localhost:8888/orchestratorservice").process(processor);
from("direct:getMarketplaceOrders").to("bean:orderHelper?method=getMarketplaceOrders");

我的目标是测试当我向 direct:getMarketplaceOrders

发出请求时从 bean:orderHelper?method=getMarketplaceOrders 收到的响应

orderHelper.getMarketplaceOrders 如下所示:-

public OrderResponse getMarketplaceOrders(GetMarketplaceOrdersRequest requestParam) throws Exception

我的测试 class 如下所示:-

public class OrderMainAppTest extends CamelTestSupport {

    @Produce(uri = "direct:getMarketplaceOrders")
    protected ProducerTemplate template;

    @EndpointInject(uri = "bean:orderHelper?method=getMarketplaceOrders")
    protected MockEndpoint resultEndpoint;

    @Test
    public void testSendMatchingMessage() throws Exception {
    String expectedBody = "<matched/>";

    template.sendBody("{\"fromDateTime\": \"2016-01-11 10:12:13\"}");

    resultEndpoint.expectedBodiesReceived(expectedBody);

    resultEndpoint.assertIsSatisfied();
    }

    @Override
    protected RouteBuilder createRouteBuilder() {
    return new RouteBuilder() {
        @Override
        public void configure() {
        from("direct:getMarketplaceOrders").to("bean:orderHelper?method=getMarketplaceOrders");
        }
    };
    }
}

每当我进行 运行 测试时,我都会收到以下异常:-

java.lang.IllegalArgumentException: Invalid type: org.apache.camel.component.mock.MockEndpoint which cannot be injected via @EndpointInject/@Produce for: Endpoint[bean://orderHelper?method=getMarketplaceOrders]

我猜这是因为我无法将 OrderHelper 传递给 camel 测试上下文。有人可以告诉我如何在模拟结果端点注入 bean 吗?

编辑:-

我尝试修改我的测试 class 如下:-

    public class OrderMainAppTest extends CamelTestSupport {

        protected OrderHelper orderHelper = new OrderHelper();

        @Produce(uri = "direct:getMarketplaceOrders")
        protected ProducerTemplate template;

        @EndpointInject(uri = "mock:intercepted")
        MockEndpoint mockEndpoint;


        @Before
        public void preSetup() throws Exception {
        orderHelper.setProducer(template);
        };

        @Test
        public void testSendMatchingMessage() throws Exception {

        GetMarketplaceOrdersRequest request = new GetMarketplaceOrdersRequest();
        request.setFromDateTime("2016-01-11 10:12:13");
        request.setApikey("secret_key");
        request.setMethod("getMarketplaceOrders");
        request.setLimit(10);
        request.setOffset(2);

        template.sendBody(request);
        mockEndpoint.expectedBodiesReceived("{\"success\":\"false\"");
        }

        @Override
        protected RouteBuilder createRouteBuilder() {
        return new RouteBuilder() {
            @Override
            public void configure() {
interceptSendToEndpoint("bean:orderHelper?method=getMarketplaceOrders")
        .to("mock:intercepted");            from("direct:getMarketplaceOrders").to("bean:orderHelper?method=getMarketplaceOrders");
            }
        };
        }

        @Override
        protected JndiRegistry createRegistry() throws Exception {
        return getRegistry();
        }

        protected JndiRegistry getRegistry() {
        JndiRegistry jndi = new JndiRegistry();
        jndi.bind("orderHelper", orderHelper);
        return jndi;
        }
    }

以上代码正确发出请求并正确流经我的应用程序。但是我无法拦截 orderHelper.getMarketplaceOrders 的响应。上面的代码只拦截了请求。我尝试更改为 template.requestBody(request)。但是还是不行。

此错误意味着您无法将 bean: 端点注入 MockEndpoint

如果您想 "intercept" 呼叫您的 OrderHelper,您可以在您的路线中使用 interceptSendToEndpoint :

@EndpointInject(uri = "mock:intercepted")
MockEndpoint mockEndpoint;

...

@Override
protected RouteBuilder createRouteBuilder() {
  return new RouteBuilder() {
    @Override
    public void configure() {

      interceptSendToEndpoint("bean:orderHelper?method=getMarketplaceOrders")
        .to("mock:intercepted");

      from("direct:getMarketplaceOrders")
        .to("bean:orderHelper?method=getMarketplaceOrders");
  }
};

参见:http://camel.apache.org/intercept.html

通过如下所示更新我的 createRouteBuilder。我能够拦截响应并将其发送到模拟端点,我可以在其中进行断言。

@Override
protected RouteBuilder createRouteBuilder() {
return new RouteBuilder() {
    @Override
    public void configure() {
    from("direct:getMarketplaceOrders").to("bean:orderHelper?method=getMarketplaceOrders").onCompletion()
        .to("mock:intercepted");
    }
};
}