我正在嘗試編寫一個Eclipse插件,它可以運行JUnit測試並對結果執行某些操作。我的插件正確加載給定的類,但未能運行JUnit測試並給出錯誤:initializationError(className): No runnable methods
。但是,當我在同一個Eclipse實例中使用Result result = JUnitCore.runClasses(className.class); Failure failure : result.getFailures();
運行測試類時,我不會收到任何錯誤。JUnitCore在Eclipse插件中給出「No runnable methods」錯誤
我認爲我的問題是@gubby在問題java.lang.Exception: No runnable methods exception in running JUnits中描述的問題,但是我不知道如何將他的建議實現爲解決方案:「解決方案是在與測試相同的ClassLoader中加載JUnitCore他們自己。」
這是我實現的一個簡化版本(請假設一切除了的可運行方式的裝載工作):
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;
}