我正在尝试使用CamelBlueprintTestSupport
来测试应用多个bean的camel路由。在生产代码中,bean是在单独的蓝图XML中定义的。在测试类中,我会像记录的那样覆盖addServicesOnStartup
方法。我的单元测试类看起来像这样:
public class MyUnit_Test extends CamelBlueprintTestSupport {
@Override
protected String getBlueprintDescriptor() {
return "/OSGI-INF/blueprint/camel-routes.xml";
}
@Override
protected void addServicesOnStartup(Map<String, KeyValueHolder<Object, Dictionary>> services) {
services.put("beanA", asService(new BeanA(), null, null));
services.put("beanB", asService(new BeanB(), null, null));
}
@EndpointInject(uri = "mock:endpointMock")
private MockEndpoint endpointMoc;
@Test
public void test_myRoute() throws Exception {
(test code)
}
}
路由中引用了一个bean(BeanA
):
<camelContext>
<route>
...
<bean ref="beanA" method="myMethod" />
...
</route>
</camelContext>
这个需要访问另一个bean(BeanB
)。我在@BeanInject
旁边使用了BeanA
注释:
public class BeanA {
@BeanInject("beanB")
private BeanB beanB;
public void myMethod(Exchange exchange) {
beanB.getSomething();
...
}
在生产中,依赖注入效果很好。
在单元测试中BeanA
可以被路由引用。但是在BeanB
内注入BeanA
似乎不起作用。当代码尝试访问BeanA.myMethod()
时,我会在beanB
收到NPE。
似乎依赖注入仅适用于蓝图XML中的路由,但不适用于注入bean本身的递归。
我试图覆盖CamelTestSupport的createRegistry
方法并以这种方式添加我的bean。但它没有用。事实上,我发现createRegistry
启动时CamelBlueprintTestSupport
未被调用。
在Camel documentation for Blueprint testing中,他们将PojoSR
称为注册表框架。但我找不到更多的例子或指示如何根据我的需要使用它。
答案 0 :(得分:3)
是的,这不是这样的。我理解服务注册表中的内容与蓝图上下文中的bean不同。
Camel将尝试使用(Camel,而不是蓝图)注释@InjectBean从上下文自动装配其bean。但Camel不会在服务注册表中摆弄东西;这些是现成的对象,可以按原样使用,也可以通过代理使用。
所以你可以:
我们需要的是CamelBlueprintTestSupport,它会考虑多个Blueprint上下文,但据我所知这是不可用的。实际上,蓝图中没有可能导入上下文(与Spring相反)。