我的工作區中有四個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不是解決此問題的正確工具?
我相信我的問題是相當具體的,因爲運行時顧名思義就是一個在運行時被其他程序使用的項目,依賴於eclipse,但也是一個插件項目,因爲它也被其他插件使用爲運行時程序創建數據......在eclipse中測試並在測試期間調用運行時代碼。 – hd42