我正在尝试使用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相反)。

10-07 12:13