2011-09-23 30 views
1

我的工作區中有四個Eclipse插件項目(創建一個新的Java項目,右鍵單擊,配置,轉換爲插件項目)。第一(my.runtime)包含的接口(MyFactoryInterface)和限定方法(List<String> getAllFactoryNames()),其通過java.util.ServiceLoader加載該接口的所有實現並呼籲它們的方法(String getName())一類(MyClient),收集的結果,並在返回它們一個列表。在Eclipse Plugins中測試ServiceLoader

爲了檢驗這一類,我在第二個項目JUnit測試(my.runtime.test,建立與my.runtime的片段,主持人),檢查如果名稱由虛擬實現返回(MyDummy,返回"Dummy")我在my.runtime.test項目位於由MyClient.getAllFactoryNames()返回的列表中。到目前爲止,它工作正常。

在第三個項目(my.extension,與my.runtime的依賴)我有一個使用由MyClient.getAllFactoryNames()返回的名稱,返回的問候("Hello "+name)列表中的類(MyHello)。

同樣,爲了測試這個,我有一個包含另一種實現方式(MyWorld,返回"World"作爲名稱)項目(my.extension.test,與my.extension的片段,主持人)和JUnit測試情況下檢查是否"Hello World"是由MyHello.getGreetings()返回的問候。此測試失敗,因爲MyClient仍然只發現MyDummy實現,而不是MyWorld實現。兩個實現都伴隨着META-INF/services/my.runtime.MyFactoryInterface文件中的匹配條目。

我目前使用下面的代碼加載實現:

ServiceLoader<MyFactoryInterface> myFactoryLoader = ServiceLoader.load(MyFactoryInterface.class); 
    for (MyFactoryInterface myFactory : myFactoryLoader) { 

我知道,我可以提供一個類加載器作爲第二個參數ServiceLoader.load,但我不知道如何得到一個知道所有的插件項目......有什麼建議?或者是ServiceLoader不是解決此問題的正確工具?

回答

1

如果有人絆倒了同樣的問題:ServiceLoader.load(MyFactoryInterface.class, Thread.currentThread().getContextClassLoader())組合MyClientThread.currentThread().setContextClassLoader(MyWorld.class.getClassLoader());在第二個測試做了這項工作。

+0

我相信我的問題是相當具體的,因爲運行時顧名思義就是一個在運行時被其他程序使用的項目,依賴於eclipse,但也是一個插件項目,因爲它也被其他插件使用爲運行時程序創建數據......在eclipse中測試並在測試期間調用運行時代碼。 – hd42