我正在尝试使用CamelBlueprintTestSupport
来测试应用多个bean的骆驼路线。在生产代码中,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
注释inide 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
称为注册表框架。但是我找不到更多的示例或说明来满足我的需求。 最佳答案
是的,这不是这样的。我的理解是,服务注册表中的内容与蓝图上下文中的bean不同。
Camel将尝试使用(Camel,而非蓝图)批注@InjectBean从上下文自动装配其bean。但是Camel不会在服务注册表中摆弄任何东西。这些都是现成的对象,可以按原样或通过代理使用。
因此,您可以:
将beanA视为服务;然后,您需要对其进行充分的准备(手动将beanB注入其中)并将其添加到服务注册表中;
为此,通过修改blueprint.xml,将beanA和beanB放在蓝图上下文中(就像在生产代码中一样)。 (我知道您可能不想这样做。)
我们需要的是一个CamelBlueprintTestSupport,它将考虑多个Blueprint上下文,但是据我所知这是不可用的。确实,不可能在Blueprint中导入上下文(与Spring相反)。