gpt4 book ai didi

java - JUnitCore 在 Eclipse 插件中给出 "No runnable methods"错误

转载 作者:行者123 更新时间:2023-12-01 10:58:31 25 4
gpt4 key购买 nike

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

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

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

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;
}

最佳答案

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

  1. Buddy Class Loading 。请注意,这会破坏松散耦合,但很容易“实现”,因为您只需在两个相应插件的 MANIFEST.MF 中添加两个语句以及一个导出语句即可。以下规则适用(来自上面给出的链接)。

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

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

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

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

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

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

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

关于java - JUnitCore 在 Eclipse 插件中给出 "No runnable methods"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33469469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com