Apache camel camel测试中的bean注入
我有一个驼峰应用程序,看起来像下面,它的路线如下:-Apache camel camel测试中的bean注入,apache-camel,Apache Camel,我有一个驼峰应用程序,看起来像下面,它的路线如下:- //processor is a custom JSONProcessor extending Processor from("jetty:http://localhost:8888/orchestratorservice").process(processor); from("direct:getMarketplaceOrders").to("bean:orderHelper?method=getMarketplaceOrders");
//processor is a custom JSONProcessor extending Processor
from("jetty:http://localhost:8888/orchestratorservice").process(processor);
from("direct:getMarketplaceOrders").to("bean:orderHelper?method=getMarketplaceOrders");
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");
}
};
}
}
从(“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");
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");
}
};
}
}
我的目标是测试当我向direct:getMarketplaceOrders
发出请求时,从bean:orderHelper?method=getMarketplaceOrders
收到的响应
orderHelper.getMarketplaceOrders如下所示:-
//processor is a custom JSONProcessor extending Processor
from("jetty:http://localhost:8888/orchestratorservice").process(processor);
from("direct:getMarketplaceOrders").to("bean:orderHelper?method=getMarketplaceOrders");
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");
}
};
}
}
public OrderResponse getMarketplaceOrders(GetMarketplaceOrdersRequestParam)引发异常
我的测试类如下所示:-
//processor is a custom JSONProcessor extending Processor
from("jetty:http://localhost:8888/orchestratorservice").process(processor);
from("direct:getMarketplaceOrders").to("bean:orderHelper?method=getMarketplaceOrders");
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");
}
};
}
}
我猜这是因为我无法将OrderHelper传递到camel测试上下文。有人能告诉我如何在模拟结果端点中注入bean吗
编辑:-
我尝试如下修改我的测试类:-
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
如果要“截获”对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");
}
};
请参见:,方法是更新mycreateRouteBuilder
,如下所示。我能够截获响应并将其发送到模拟端点,在那里我可以进行断言
@Override
protected RouteBuilder createRouteBuilder() {
return new RouteBuilder() {
@Override
public void configure() {
from("direct:getMarketplaceOrders").to("bean:orderHelper?method=getMarketplaceOrders").onCompletion()
.to("mock:intercepted");
}
};
}
我不明白:你从来没有在你的测试中实例化过OrderMainApp,你是如何“测试它”的?我向您解释了您看到的错误是什么,以及如何修复它:此错误与注册表无关,它以前发生过。无论如何,您无法测试OrderMainApp.createRegistry
,因为您需要一个camelcontext来创建注册表,而在CamelTestSupport
中,您需要一个注册表来创建camelcontext。我给您的答案是相同的。向路由生成器添加一个interceptSendToEndpoint
,如我的示例所示,如果我在路由生成器interceptSendToEndpoint(“bean:orderHelper?method=getMarketplaceOrders”)。添加到(“mock:intercepted”)代码>我只能截获传入的请求。实际上,我需要orderHelper.getMarketPlaceOrders的响应,以便在输出上断言。那么,是否有一种方法可以只截获响应/传出消息?请使用requestBody
而不是sendBody
:如果我正确地获取了您的响应,我就执行了模板。requestBody(请求)代码>但我仍然只收到请求