有没有办法跳过Camel蓝图测试的“等待依赖”?

时间:2016-06-08 03:23:36

标签: apache-camel blueprint-osgi

我有一些Camel蓝图单元测试针对驼峰路线运行。该路由是一个简单的camel路由,它从activemq队列中提取消息,然后发送到另一个队列。我正在使用osgi服务来公开我发送和接收的amq组件。

<reference id="activemq-in" filter="(osgi.jndi.service.name=amq/in)" interface="org.apache.camel.Component" />

  <camelContext>
    <route>
      <from uri="activemq-in:queue:some.queue" />
      ...
      <to uri="activemq-in:queue:some.other.queue" />
    </route>
  </camelContext>

在我的单元测试中,我用其他东西来删除amq组件但是每当我运行我的单元测试时,他们总是等待activemq依赖关系大约30秒才放弃并且单元测试成功运行。

INFO BlueprintContainerImpl - Bundle UnitTest / 1.0.0正在等待依赖[(&amp;(osgi.jndi.service.name = amq / in)(objectClass = org.apache.camel.Component))]

我有没有办法让Camel蓝图测试跳过等待依赖阶段?

编辑:

只需加载蓝图的空白单元测试示例,等待不存在的osgi服务30秒,然后放弃并通过:

public class CamelTest extends CamelBlueprintTestSupport {

    // Loads the blueprint for the unit test
    @Override
    protected String getBlueprintDescriptor() {
         return "OSGI-INF/blueprint/blueprint.xml";
    }

    // configures the osgi service to use the embedded amq broker instead of the osgi resource
    @Override
    protected BundleContext createBundleContext() throws Exception {
        BundleContext bundleContext = super.createBundleContext();
        ActiveMQComponent activeMQComponent = new ActiveMQComponent();
        activeMQComponent.setBrokerURL("vm://amq");

        Properties inboundProperties = new Properties();
        inboundProperties.setProperty("osgi.jndi.service.name", "amq/in");
        bundleContext.registerService("org.apache.camel.Component", activeMQComponent, (Dictionary) inboundProperties);

         return bundleContext;
    }

    @Test
    public void blankTest() {
    }
}

2 个答案:

答案 0 :(得分:0)

如果单元测试不需要该服务,则可以为测试创建假的blueprint / spring.xml文件。除此之外,您不能在启动时启动该服务。你必须在测试中引用它,也可以选择不启动正常的包:

>   @Override   protected String getBundleFilter() {
>     // don't want the normal marc21import bundle to start as it causes conflict to our test
>     return "(!(Bundle-SymbolicName=<bundle_name>))";   }
> 
>   @Override   protected String getBlueprintDescriptor() {
>     return "blueprint/fake_blueprint.xml";   }

答案 1 :(得分:0)

是的,有一种方法可以解决这个问题(我已经经历过这种恼人的等待蓝图单元测试的依赖性东西)。我如何处理这个问题?是通过在自己的文件中组织bean定义。

例如,

我将CXF / JPA的bean声明保存在自己的bean-context.xml中,如jpa-context.xml / cxf-context.xml。

显然,在我的单元测试用例蓝图文件中,我不会加载这些jpa / cxf bean上下文。

在这种方法中,还需要组织路线,您需要设计路线,使得具有这些外部集成的路线保持在单独的轻量级网关路线中。将所有这些网关路由保留在单独的路由上下文文件中。并且不要在蓝图单元测试用例中加载它们。

幸运的是,我们不需要在蓝图中明确导入文件。 !

为什么采用这种方法?

  1. 我没有使用单元测试用例来测试外部集成(无论如何都会进行集成测试),我主要是为了测试我的路由逻辑,转换&amp;商业规则。

  2. 您无需维护2个不同的bean上下文文件即可进行测试。主要。

  3. 猜猜它有帮助!

    示例文件结构:

    bean-context.xml(in scope for unit testing)
    cxf-context.xml(not required to include in unit testing)
    jpa-context.xml(not required to include in unit testing)
    gateway-routes.xml(not required to include in unit testing)
    business-routes.xml(in scope for unit testing)
    

    这样你就不会看到'正在等待cxf的依赖'

    注意:还要确保删除每个xml文件中未使用的xml名称空间声明。