Camel @BeanInject在Blueprint-Test

时间:2016-01-03 16:43:04

标签: java unit-testing dependency-injection apache-camel blueprint-osgi

我正在尝试使用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称为注册表框架。但我找不到更多的例子或指示如何根据我的需要使用它。

1 个答案:

答案 0 :(得分:3)

是的,这不是这样的。我理解服务注册表中的内容与蓝图上下文中的bean不同。

Camel将尝试使用(Camel,而不是蓝图)注释@InjectBean从上下文自动装配其bean。但Camel不会在服务注册表中摆弄东西;这些是现成的对象,可以按原样使用,也可以通过代理使用。

所以你可以:

  • 将beanA视为服务;然后你完全准备它(手动注入beanB)并将其添加到服务注册表中;
  • 通过修改blueprint.xml来将beanA和beanB放在蓝图上下文中(就像在生产代码中一样)。 (我知道你可能不想这样做。)

我们需要的是CamelBlueprintTestSupport,它会考虑多个Blueprint上下文,但据我所知这是不可用的。实际上,蓝图中没有可能导入上下文(与Spring相反)。