2011-09-23 3 views
1

내 작업 영역에 4 개의 Eclipse 플러그인 프로젝트 (새 Java 프로젝트 작성, 마우스 오른쪽 버튼 클릭, 구성, 플러그인 프로젝트로 변환)가 있습니다. 첫 번째 (my.runtime)에는 java.util.ServiceLoader을 통해 해당 인터페이스의 모든 구현을로드하고 (String getName()) 메서드를 호출하여 결과를 수집하고 반환하는 메서드 (List<String> getAllFactoryNames())를 정의하는 인터페이스 (MyFactoryInterface)와 클래스 (MyClient) 목록. 이클립스 플러그인의 ServiceLoader 테스트

내가에있는 ( "Dummy"를 반환 MyDummy) 이름이 더미 구현에 의해 반환되는 경우 확인, 내가 (조각-호스트로 my.runtime로 설정 my.runtime.test) 두 번째 프로젝트의 JUnit 테스트를, 그 클래스를 테스트하려면 my.runtime.test 프로젝트가 MyClient.getAllFactoryNames()에 의해 반환 된 목록에 있습니다. 지금까지, 그것은 잘 작동합니다. 내가 인사의 목록 ( "Hello "+name)을 반환하는 MyClient.getAllFactoryNames()에 의해 반환 된 이름을 사용하는 클래스 ( MyHello)가 세 번째 프로젝트에서

(의존성 등 my.runtimemy.extension).

다시 말하지만,이 테스트를 위해, 나는 (조각-호스트로 my.extensionmy.extension.test) 프로젝트 ( MyWorld 이름으로 "World"을 반환하는) 다른 구현을 포함하고 "Hello World"MyHello.getGreetings()에 의해 반환 된 인사에 있는지 확인 JUnit 테스트 케이스를 . MyClient는 여전히 MyDummy 구현 만 찾으며 MyWorld 구현은 찾지 않기 때문에이 테스트는 실패합니다. 두 구현 모두 META-INF/services/my.runtime.MyFactoryInterface 파일의 항목과 일치합니다.

나는 현재 구현을로드하기 위해 다음 코드를 사용

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

내가 ServiceLoader.load에 두 번째 인자로 클래스 로더를 제공 할 수 있다는 것을 알고 있지만, 나는 모든 플러그인을 알고 하나를 얻을하는 방법을 몰라 프로젝트 ... 어떤 제안? 아니면 ServiceLoader가이 문제에 적합한 도구가 아닌가?

답변

1

같은 문제가 발생하면 두 번째 테스트에서 MyClientThread.currentThread().setContextClassLoader(MyWorld.class.getClassLoader());ServiceLoader.load(MyFactoryInterface.class, Thread.currentThread().getContextClassLoader())을 조합하면 문제가 해결됩니다.

+0

런타임에 이름이 알 수 있듯이 런타임에 다른 프로그램에서 사용하는 프로젝트 인 Eclipse와 마찬가지로 런타임에 다른 문제가 아니라 다른 플러그인에서 사용되기 때문에 플러그인 프로젝트이기 때문에 문제가 다소 구체적이라고 생각합니다. 이클립스에서 테스트 된 런타임 프로그램 용 데이터를 생성하고 테스트 중에 런타임 코드를 호출한다. – hd42