在骆驼测试中进行 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");
}
};
通过如下所示更新我的 createRouteBuilder
。我能够拦截响应并将其发送到模拟端点,我可以在其中进行断言。
@Override
protected RouteBuilder createRouteBuilder() {
return new RouteBuilder() {
@Override
public void configure() {
from("direct:getMarketplaceOrders").to("bean:orderHelper?method=getMarketplaceOrders").onCompletion()
.to("mock:intercepted");
}
};
}
我有一个 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");
}
};
通过如下所示更新我的 createRouteBuilder
。我能够拦截响应并将其发送到模拟端点,我可以在其中进行断言。
@Override
protected RouteBuilder createRouteBuilder() {
return new RouteBuilder() {
@Override
public void configure() {
from("direct:getMarketplaceOrders").to("bean:orderHelper?method=getMarketplaceOrders").onCompletion()
.to("mock:intercepted");
}
};
}