使用 Junit 4.4 或更高版本运行 Eclipse Junit 插件测试 - 为什么没有检测到测试?

2022-09-01 23:54:20

我需要在一组 eclipse 插件测试中使用 JUnit 4.4(或更高版本),但我遇到了以下问题:

使用来自 springsource(junit44 junit45)的 junit 4.4 或 4.5 捆绑包运行时,不会检测到测试。可以使用日食获得的 org.junit4 捆绑包提供 junit 4.3(截至 Ganymead / Eclipse 3.4)。org.junit4捆绑包确实有效,因为它可以识别并运行测试,但它与最新版本的JMock不兼容,我需要使用模拟库。

下面是一个示例测试:

package testingplugin;

import static org.junit.Assert.*;
import org.junit.Test;

public class ActivatorTest {
   @Test
   public final void testDoaddTest() {
      fail("Not yet implemented");
   }
}

运行此测试时,我收到以下异常:

java.lang.Exception: No runnable methods
    at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:33)
    at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
    at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
    at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:45)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
    at org.eclipse.pde.internal.junit.runtime.RemotePluginTestRunner.main(RemotePluginTestRunner.java:62)
    at org.eclipse.pde.internal.junit.runtime.CoreTestApplication.run(CoreTestApplication.java:23)
    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.internal.app.EclipseAppContainer.callMethodWithException(EclipseAppContainer.java:574)
    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:195)
    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:382)
    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:549)
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:504)
    at org.eclipse.equinox.launcher.Main.run(Main.java:1236)
    at org.eclipse.equinox.launcher.Main.main(Main.java:1212)

但是,如果我将项目依赖项从 com.springsource.org.junit 切换到 org.junit4,则测试运行并失败(如预期的那样)。

我在 Eclipse 中将测试作为 JUnit 插件测试运行,具有以下程序参数:

-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl}

以下插件在启动期间选择(由我选择,然后我使用“添加所需的插件”来获取其余的依赖项。

Workspace:
   testingPlugin
Target Platform:
   com.springsource.org.hamcrest.core (1.1.0)
   com.springsource.org.junit (4.5.0)
   ....and a bunch of others... (nothing related to testing was auto-selected)

这是我的清单。中频:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: TestingPlugin Plug-in
Bundle-SymbolicName: testingPlugin
Bundle-Version: 1.0.0
Bundle-Activator: testingplugin.Activator
Import-Package: org.osgi.framework;version="1.3.0"
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Require-Bundle: com.springsource.org.junit;bundle-version="4.5.0"

将最后一行切换为:

Require-Bundle: org.junit4;bundle-version="4.3.1"

并在启动时将所选插件更新为:

Workspace:
   testingPlugin
Target Platform:
   org.junit4 (4.3.1)
   ...bunches of auto-selected bundles... (again, nothing else test related)

使测试正常运行(但使用错误的 junit 版本)。


答案 1

根据我的经验,如果包含插件测试的插件不依赖于 junit,就会发生这种情况。将 junit 4.4 依赖项添加到我的 MANIFEST 之后。MF 文件错误消失,所有测试均已执行。junit 依赖项应该是可选的,因为插件通常只需要测试代码。


答案 2

我现在无法测试它,因为我没有方便的Eclipse 3.4安装,但是我不久前在IntelliJ IDEA 7.0.x中遇到了类似的问题,解决方法是显式指定测试运行程序。

使用 JUnit 4.5:

import org.junit.runners.JUnit4;

@RunWith(JUnit4.class)
public class ActivatorTest {
    //...
}

如果这不起作用,您可能会取得更大的成功org.junit.runners.BlockJUnit4ClassRunner

对于JUnit 4.4,我会尝试org.junit.internal.runners.JUnit4ClassRunner

编辑:不太确定该部分,因为我不使用Springsource。从你的问题来看,似乎springsource重新打包了JUnit,但你只在代码中使用,所以我会坚持下去。com.springsource.com.springsource.org.junitorg.junit


推荐