如何使用JMock运行JUnit Eclipse插件测试?

时间:2023-02-05 10:31:05

I have Eclipse plug-in and junit tests for it, which are using jMock library.

我有Eclipse插件和junit测试,它使用的是jMock库。

When I run my test 'as junit', all tests are running correctly. But when I run them 'as JUnit plugin test' I'm getting the following error:

当我作为junit运行我的测试时,所有的测试都是正确运行的。但当我把它们作为JUnit插件测试时,我得到了以下错误:

java.lang.TypeNotPresentException: Type [unknown] not present
at sun.reflect.annotation.TypeNotPresentExceptionProxy.generateException(TypeNotPresentExceptionProxy.java:27)
at sun.reflect.annotation.AnnotationInvocationHandler.invoke(AnnotationInvocationHandler.java:56)
at $Proxy4.value(Unknown Source)
at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:29)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.<init>(JUnit4TestClassReference.java:25)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:40)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:30)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.pde.internal.junit.runtime.RemotePluginTestRunner.main(RemotePluginTestRunner.java:62)
at org.eclipse.pde.internal.junit.runtime.UITestApplication$1.run(UITestApplication.java:114)
at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:134)
at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3468)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3115)
at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2405)
at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2369)
at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2221)
at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:500)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:493)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:113)
at org.eclipse.pde.internal.junit.runtime.UITestApplication.start(UITestApplication.java:46)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:194)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:368)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:559)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:514)
at org.eclipse.equinox.launcher.Main.run(Main.java:1311)
at org.eclipse.equinox.launcher.Main.main(Main.java:1287)
Caused by: java.lang.NoClassDefFoundError: org/junit/internal/runners/JUnit4ClassRunner
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.defineClass(DefaultClassLoader.java:183)
at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.defineClass(ClasspathManager.java:576)
at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findClassImpl(ClasspathManager.java:546)
at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClassImpl(ClasspathManager.java:477)
at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass_LockClassLoader(ClasspathManager.java:465)
at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:445)
at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:211)
at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:376)
at org.eclipse.osgi.internal.loader.SingleSourcePackage.loadClass(SingleSourcePackage.java:33)
at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:449)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:405)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:393)
at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:105)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at sun.reflect.generics.factory.CoreReflectionFactory.makeNamedType(CoreReflectionFactory.java:95)
at sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:107)
at sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:31)
at sun.reflect.annotation.AnnotationParser.parseSig(AnnotationParser.java:370)
at sun.reflect.annotation.AnnotationParser.parseClassValue(AnnotationParser.java:351)
at sun.reflect.annotation.AnnotationParser.parseMemberValue(AnnotationParser.java:280)
at sun.reflect.annotation.AnnotationParser.parseAnnotation(AnnotationParser.java:222)
at sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.java:69)
at sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:52)
at java.lang.Class.initAnnotationsIfNecessary(Class.java:3070)
at java.lang.Class.getAnnotation(Class.java:3029)
at org.junit.internal.builders.IgnoredBuilder.runnerForClass(IgnoredBuilder.java:13)
... 39 more
Caused by: java.lang.ClassNotFoundException: org.junit.internal.runners.JUnit4ClassRunner
at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:489)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:405)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:393)
at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:105)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
... 70 more

How to fix this? Appreciate any help.

如何解决这个问题?感谢任何帮助。

1 个解决方案

#1


2  

I've fixed it. JMock plugin, which I initially created, was the following:

我固定它。我最初创建的JMock插件是:

plugin.xml:

plugin . xml:

<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.0"?>
<plugin
id="jmock-2.5.1"
name="JMockClasses Plug-in"
version="1.0.0"
provider-name="">

<runtime>
  <library name="bsh-core-2.0b4.jar">
     <export name="*"/>
  </library>
  <library name="cglib-2.1_3-src.jar">
     <export name="*"/>
  </library>
  ...
  <library name="jmock-2.5.1.jar">
     <export name="*"/>
  </library>      
  <library name="jmock-junit4-2.5.1.jar">
     <export name="*"/>
  </library>
  ...
</runtime>
<requires>
   <import plugin="org.eclipse.core.runtime.compatibility"/>
</requires>


</plugin>

i. e. it was just a library on my classpath. I've changed it to the following: META-INF/MANIFEST.MF:

它只是我的类路径上的一个库。我将它改为:META-INF/MANIFEST.MF:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: JMockPlugin
Bundle-SymbolicName: org.jmock_2.5.1
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: jmock.Activator
Require-Bundle: org.eclipse.ui,
 org.eclipse.core.runtime,
 org.junit4
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Bundle-ActivationPolicy: lazy
Bundle-ClassPath: bsh-core-2.0b4.jar,
 cglib-2.1_3-src.jar,
 cglib-nodep-2.1_3.jar,
 hamcrest-core-1.1.jar,
 hamcrest-library-1.1.jar,
 jmock-2.5.1.jar,
 jmock-junit3-2.5.1.jar,
 jmock-junit4-2.5.1.jar,
 jmock-legacy-2.5.1.jar,
 jmock-script-2.5.1.jar,
 objenesis-1.0.jar

Now Eclipse OSGI classloader is able to load my JMockPlugin and I do not have any problems.

现在Eclipse OSGI类加载器能够加载我的JMockPlugin,而且我没有任何问题。

#1


2  

I've fixed it. JMock plugin, which I initially created, was the following:

我固定它。我最初创建的JMock插件是:

plugin.xml:

plugin . xml:

<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.0"?>
<plugin
id="jmock-2.5.1"
name="JMockClasses Plug-in"
version="1.0.0"
provider-name="">

<runtime>
  <library name="bsh-core-2.0b4.jar">
     <export name="*"/>
  </library>
  <library name="cglib-2.1_3-src.jar">
     <export name="*"/>
  </library>
  ...
  <library name="jmock-2.5.1.jar">
     <export name="*"/>
  </library>      
  <library name="jmock-junit4-2.5.1.jar">
     <export name="*"/>
  </library>
  ...
</runtime>
<requires>
   <import plugin="org.eclipse.core.runtime.compatibility"/>
</requires>


</plugin>

i. e. it was just a library on my classpath. I've changed it to the following: META-INF/MANIFEST.MF:

它只是我的类路径上的一个库。我将它改为:META-INF/MANIFEST.MF:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: JMockPlugin
Bundle-SymbolicName: org.jmock_2.5.1
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: jmock.Activator
Require-Bundle: org.eclipse.ui,
 org.eclipse.core.runtime,
 org.junit4
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Bundle-ActivationPolicy: lazy
Bundle-ClassPath: bsh-core-2.0b4.jar,
 cglib-2.1_3-src.jar,
 cglib-nodep-2.1_3.jar,
 hamcrest-core-1.1.jar,
 hamcrest-library-1.1.jar,
 jmock-2.5.1.jar,
 jmock-junit3-2.5.1.jar,
 jmock-junit4-2.5.1.jar,
 jmock-legacy-2.5.1.jar,
 jmock-script-2.5.1.jar,
 objenesis-1.0.jar

Now Eclipse OSGI classloader is able to load my JMockPlugin and I do not have any problems.

现在Eclipse OSGI类加载器能够加载我的JMockPlugin,而且我没有任何问题。