2015-11-02 41 views
0

我正在嘗試編寫一個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; 
} 

回答

0

對於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中有一個用於碎片的嚮導,但它們本身基本上是插件,它們聲明瞭一個「主機插件」。

那麼,你可以考慮把你的代碼放到一個片段,並附上含該代碼被測各自的插件。或者,如果您需要針對不同的插件重新使用您的代碼並且不關心鬆散耦合,請使用Buddy Class Loading

另外,檢查您是否擁有插件中的所有正確的依賴關係(例如,org.junit)。您需要包含在Java開發工具中的JUnit

相關問題