运行JUNIT测试用例时无法加载ApplicationContext

时间:2014-01-03 18:59:28

标签: java osgi osgi-bundle apache-servicemix spring-dm

我在ServiceMix Container中部署了OSGI Bundle(B)。 B也充当OSGI端点。我们可以看到以下行(来自我的ApplicationContext.xml)

<osgi:service id="SampleManagementService" ref="ManagementService" interface="com.abc.webservice.xyz.ISampleManagementService"/>

现在,我在同一个servicemix容器中部署了另一个Bundle(C),C想要使用从B公开的OSGI服务。所以我在Bundle C的applicationContext中添加了以下行。

<osgi:reference id="SampleManagementService" interface="com.abc.webservice.xyz.ISampleManagementService"/>

到目前为止一切顺利。现在我在Bundle C中编写了一个JUNIT测试用例,它在执行测试用例之前尝试加载它的applicationContext.xml。以下是我的测试类的片段:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"/META-INF/spring/camel-context.xml"})
public class TimerTest {
   //some logic to execute the test.
}

每当我尝试运行此单元测试用例时,我都会得到 java.lang.IllegalStateException:。这太普通了,不能给我任何关于这个问题的线索。

以下是我在控制台中看到的异常的堆栈跟踪:

main] TestContextManager ERROR Caught exception while allowing        TestExecutionListener        [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@1526ea43] to prepare test instance [com.abc.sms.webservice.test.TimerTest@2ddddf8e]
java.lang.IllegalStateException: Failed to load ApplicationContext
at   org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:308) [spring-test-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at  org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109)[spring-test-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75)[spring-test-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:321)[spring-test-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:220)[spring-test-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:301)[spring-test-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)[junit-4.7.jar:]
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:303)[spring-test-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:240)[spring-test-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)[junit-4.7.jar:]
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)[junit-4.7.jar:]
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)[junit-4.7.jar:]
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)[junit-4.7.jar:]
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)[junit-4.7.jar:]
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)[junit-4.7.jar:]
at  org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)[spring-test-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)[spring-test-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)[junit-4.7.jar:]
at  org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180)[spring-test-3.0.5.RELEASE.jar:3.0.5.RELEASE]

我不确定是什么导致了这个问题。我尝试从POM.xml中删除JARS,但该dint也有帮助。我还在Stackoverflow中查找了类似的问题,但是大部分问题都是在我的测试类中更改Application-Context.xml的类路径,这肯定不是我的情况。只要从Bundle C中删除&lt; osgi:reference&gt; ,我的测试就会成功运行。

任何建议都会有所帮助。感谢。

2 个答案:

答案 0 :(得分:1)

如果您有OSGI服务参考(您使用的是osgi:reference spring标记),那么在评估单元测试时需要该参考。由于您运行的单元测试没有OSGI运行时,因此osgi:reference失败。

您最好的选择是使用备用版本的/META-INF/spring/camel-context.xml编写单元测试,该版本不会尝试使用OSGI运行时。

在不知道您所使用的弹簧版本的情况下,3.1中的profiles也可以提供帮助。

答案 1 :(得分:1)

这个名为Pax Exam的项目用于OSGi容器中的JUnit。由于ServiceMix基于Top of Karaf,您可能有兴趣知道Pax Exam还支持Karaf容器作为运行时(自3.4版本起)。您将找到有关如何使用Pax Exam at OPS4j的更多详细信息。您可能还对如何测试Camel OSGi感兴趣,Testing Camel JPA Routes上有一篇博文。即使博客文章使用蓝图,它也很容易转移到春天。