我有一些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() {
}
}
答案 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上下文。
在这种方法中,还需要组织路线,您需要设计路线,使得具有这些外部集成的路线保持在单独的轻量级网关路线中。将所有这些网关路由保留在单独的路由上下文文件中。并且不要在蓝图单元测试用例中加载它们。
幸运的是,我们不需要在蓝图中明确导入文件。 !
为什么采用这种方法?
我没有使用单元测试用例来测试外部集成(无论如何都会进行集成测试),我主要是为了测试我的路由逻辑,转换&amp;商业规则。
您无需维护2个不同的bean上下文文件即可进行测试。主要。
猜猜它有帮助!
示例文件结构:
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名称空间声明。