在 运行 测试时,找不到 Pax 考试选项 class 的课程

Getting ClassNotFound for PaxExam Option class when running test

当 运行 使用 PaxExam 进行单元测试时,我得到这个 ClassNotFoundException:

java.lang.ClassNotFoundException: org.ops4j.pax.exam.Option
at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:513)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:429)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:417)
at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2693)
at java.lang.Class.privateGetPublicMethods(Class.java:2894)
at java.lang.Class.privateGetPublicMethods(Class.java:2903)
at java.lang.Class.getMethods(Class.java:1607)
at org.ops4j.pax.exam.invoker.junit.internal.JUnitProbeInvoker.findAndInvoke(JUnitProbeInvoker.java:94)
at org.ops4j.pax.exam.invoker.junit.internal.JUnitProbeInvoker.call(JUnitProbeInvoker.java:73)
at org.ops4j.pax.swissbox.framework.RemoteFrameworkImpl.invokeMethodOnService(RemoteFrameworkImpl.java:433)
at org.ops4j.pax.swissbox.framework.RemoteFrameworkImpl.invokeMethodOnService(RemoteFrameworkImpl.java:406)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:323)
at sun.rmi.transport.Transport.run(Transport.java:178)
at sun.rmi.transport.Transport.run(Transport.java:175)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:174)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:557)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:812)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:671)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

即使 PaxExam JAR(和所有依赖项)位于 Maven 类路径中,也会发生这种情况。

很长一段时间以来,我一直在努力寻找解决这个问题的方法;我真的很感激任何人可以提供的任何建议。谢谢。

编辑:

错误似乎是由于每个测试都在实现从另一个提供默认 @Configuration 方法的包(动态)导入的接口 BundleTest。此捆绑包(当前)未明确导出或导入 pax 考试 类,所以这可能是问题的一部分?

我测试过后会再次更新问题。

您的包需要导入包 org.ops4j.pax.exam,例如META-INF/MANIFEST.MF:

中的类似内容
Import-Package: org.ops4j.pax.exam

更新:请参阅 this wiki page 了解更多信息。

问题确实似乎是 class 正在通过导入另一个 class 引用导入 Pax classes。

为了说明导入:

class A <-- class B <-- 人

问题是 class B 没有在 Bundle 清单中导入 Pax Exam classes。因此,当 Pax 在 class A 中为测试 classes 创建动态导入时,class B 来自另一个包。这意味着 OSGi 没有解析 class B.

中的导入

我想,接下来的教训是检查其他依赖包的声明依赖关系

希望这对以后遇到此问题的其他人有所帮助!