JUnitCore在Eclipse插件中给出“没有可运行的方法”错误

时间:2015-11-02 01:43:12

标签: java eclipse junit eclipse-plugin eclipse-pde

我正在尝试编写一个可以运行JUnit测试并对结果执行某些操作的Eclipse插件。我的插件正确加载了一个给定的类,但无法运行JUnit测试并给出错误:initializationError(className): No runnable methods。但是,当我在同一个Eclipse实例中使用Result result = JUnitCore.runClasses(className.class); Failure failure : result.getFailures();运行测试类时,我没有收到任何错误。

我认为我的问题是@gubby在问题java.lang.Exception: No runnable methods exception in running JUnits中描述的问题,但我不知道如何将他的建议实施到一个解决方案中:“解决方案是在同一个ClassLoader中加载JUnitCore作为测试本身。“

这是我的实现的简化版本(请假设除了加载runnable方法之外的所有内容都有效):

ClassLoader classLoader = ClassLoaderHelper.getClassLoader(FileFinder.getCurrentProject());
Class clazz = classLoader.loadClass(fileName.substring(0, fileName.indexOf(".class")));
Result result = JUnitCore.runClasses(clazz);
Failure failure : result.getFailures()

获取ClassLoader的代码如下:

public static ClassLoader getClassLoader(IProject project) {
    String[] classPathEntries = null;
    try {
        project.open(null);
        IJavaProject javaProject = JavaCore.create(project);
        classPathEntries = JavaRuntime.computeDefaultRuntimeClassPath(javaProject);
    } catch (CoreException e1) {
        e1.printStackTrace();
    }

    List<URL> urlList = new ArrayList<URL>();
    for (String entry : classPathEntries) {
        IPath path = new Path(entry);
            URL url;
            try {
                url = path.toFile().toURI().toURL();
                urlList.add(url);
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
    }
    ClassLoader parentClassLoader = project.getClass().getClassLoader();
    URL[] urls = (URL[]) urlList.toArray(new URL[urlList.size()]);
    URLClassLoader classLoader = new URLClassLoader(urls, parentClassLoader);

    return classLoader;
}

1 个答案:

答案 0 :(得分:1)

对于Eclipse插件,基本上有两个选项让一个插件与另一个插件共享一个类加载器。

  1. Buddy Class Loading。请注意,这会破坏松耦合,但是只需在两个相应的插件'MANIFEST.MF和导出语句中添加两个语句就可以轻松实现。以下规则适用(来自上面给出的链接)。

    • 捆绑包Y必须指定注册的好友策略(即Eclipse-BuddyPolicy:已注册)

    • 包X必须在Eclipse-RegisterBuddy头中指定Y的符号名称(即Eclipse-RegisterBuddy:Y)

    • 捆绑包X必须依赖于捆绑包Y导出的包。这可以通过Require-Bundle或Import-Package约束来实现。

  2. Fragments:您可以将片段“附加”到插件中。两者共享相同的类加载器。通常,这种技术用于插件i18n之类的东西,但它也是向插件添加单元测试的推荐做法。这样,测试不必进入同一个插件,并且可能不需要的测试类或依赖项不会进入生产代码。

    Eclipse中有一个片段向导,但它们本身就是插件,它们声明了一个“主机插件”。

  3. 因此,您可以考虑将代码放入片段并将其附加到包含待测代码的相应插件中。或者,如果您需要为不同的插件重用代码而不关心松散耦合,请使用 Buddy Class Loading

    另外,检查插件中是否包含所有正确的依赖项(例如org.junit)。您需要 Java开发工具中包含的 JUnit