Тестирование ServiceLoader в плагинах Eclipse - PullRequest
1 голос
/ 23 сентября 2011

У меня есть четыре проекта плагинов Eclipse (создайте новый проект Java, щелкните правой кнопкой мыши, настройте, преобразуйте в проект плагина) в моей рабочей области.Первый (my.runtime) содержит интерфейс (MyFactoryInterface) и класс (MyClient), который определяет метод (List<String> getAllFactoryNames()), который загружает все реализации этого интерфейса через java.util.ServiceLoader и вызывает метод (String getName()).*) для них, собирая результаты и возвращая их в виде списка.

Чтобы протестировать этот класс, у меня есть тест JUnit во втором проекте (my.runtime.test, настроенный с my.runtime как Fragment-Host), проверяя, находится ли имя, возвращаемое фиктивной реализацией (MyDummy, возвращающее "Dummy"), которое у меня есть в проекте my.runtime.test, в списке, возвращаемом MyClient.getAllFactoryNames().Пока все работает нормально.

В третьем проекте (my.extension, с my.runtime в качестве зависимости) у меня есть класс (MyHello), который использует имена, возвращаемые MyClient.getAllFactoryNames(), чтобы вернутьсписок приветствий ("Hello "+name).

Опять же, чтобы проверить это, у меня есть проект (my.extension.test, с my.extension в качестве Fragment-Host), содержащий другую реализацию (MyWorld, возвращающая * 1027)* как имя) и тестовый пример 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) {

Я знаю, что могу предоставить ClassLoader в качестве второгоаргумент ServiceLoader.load, но я понятия не имею, как получить тот, который знает все проекты плагинов ... какие-либо предложения?Или ServiceLoader не подходит для этой проблемы?

1 Ответ

1 голос
/ 26 сентября 2011

Если кто-то сталкивается с той же проблемой: комбинация ServiceLoader.load(MyFactoryInterface.class, Thread.currentThread().getContextClassLoader()) в MyClient и Thread.currentThread().setContextClassLoader(MyWorld.class.getClassLoader()); во втором тесте сделала свое дело.

...