2012-05-09 1 views
3

나는 메이븐없이 RCP-이클립스 응용 프로그램 을 테스트하기 위해 이클립스에서 JUnit을-테스트를 ​​쓰고 있어요. 일부 테스트 케이스의 경우, Powermock (Easymock 포함)을 사용하여 객체 생성 및 정적 메소드를 모방해야합니다.세 번째 (플러그인)에서 참조 할 때 Powermock가, 이클립스의 JUnit 플러그인 테스트를 위해 ClassNotFoundException가 리드

나는 testet이어야하는 클래스와 해당 테스트가 포함 된 두 번째 플러그인을 포함하는 플러그인을 가지고있다. 의 그들을 기부합시다 PluginObject 및 PluginTest :

근무 상황 :

* PluginObject 
    - src 
     - ClassUnderTest 

* PluginTest 
- src 
    - TestCase 
- lib 
    - easymock 
    - powermock 
    - ... [aditional classes (like JavaAssist)] 
테스트 케이스 PLuginTest에서 powermock - 항아리로 구성

및 플러그인 - 매니페스트 - Runtim 구성 정상 실행하고 원하는 결과를 반환 .

내 TestCase에 현재 @RunWith -Annotation를 사용하여 다음 라인으로 시작 :

@RunWith(PowerMockRunner.class) 
@PowerMockIgnore({ "javax.management.*", 
"javax.xml.parsers.*", 
"com.sun.org.apache.xerces.internal.jaxp.*", 
"javax.xml.*", 
"ch.qos.logback.classic.*", 
"org.slf4j.*", 
"org.eclipse.core.runtime.jobs.ISchedulingRule" }) 
@PrepareForTest ({Controller.class,ProcessLoaderFactory.class,Engine.class,CommandCollector.class}) 
@SuppressStaticInitializationFor({"Controller"," ProcessLoaderFactory","Engine","CommandCollector"}) 
public class ControllerTest { 
... 
[skipped package information due to copyrights] 

하지만, 내 응용 프로그램에서 조롱에 대한 Powermock를 사용하려면 여러 플러그인이 그것을 그 나에게 또 다른 특별한 플러그인에 공유 라이브러리를 좋은 아이디어를 추출하는 것 같다 위해 - Test.Util 현실을 부르 자 모든 들어

* PluginObject 
    - src 
     - ClassUnderTest 

* PluginTest 
- src 
    - TestCase 

* Test.Util 
- lib 
    - easymock 
    - powermock 
    - ... [aditional classes (like JavaAssist)] 

Powermock을 제외한 다른 라이브러리 나는 아무런 문제가 없다.하지만 Powellock을 PluginTest에서 Test.Util-Plugin으로 옮길 때 JUnit PLugin-Test를 시작할 때 초기화 중에 "ClassNotFoundException"이 발생한다.

java.lang.ClassNotFoundException: xxx.yyy.zzz.MyTest 
at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:513) 
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:429) 
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:417) 
at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107) 
at java.lang.ClassLoader.loadClass(Unknown Source) 
at org.powermock.core.classloader.MockClassLoader.loadModifiedClass(MockClassLoader.java:143) 
at org.powermock.core.classloader.DeferSupportingClassLoader.loadClass(DeferSupportingClassLoader.java:67) 
at java.lang.ClassLoader.loadClass(Unknown Source) 
at java.lang.Class.forName0(Native Method) 
at java.lang.Class.forName(Unknown Source) 
at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:133) 
at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:39) 
at org.powermock.tests.utils.impl.AbstractTestSuiteChunkerImpl.createTestDelegators(AbstractTestSuiteChunkerImpl.java:217) 
at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.<init>(JUnit4TestSuiteChunkerImpl.java:59) 
at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.<init>(AbstractCommonPowerMockRunner.java:32) 
at org.powermock.modules.junit4.PowerMockRunner.<init>(PowerMockRunner.java:31) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
at java.lang.reflect.Constructor.newInstance(Unknown Source) 
at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31) 
at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) 
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) 
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) 
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) 
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:33) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.<init>(JUnit4TestClassReference.java:25) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:48) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:38) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
at org.eclipse.pde.internal.junit.runtime.RemotePluginTestRunner.main(RemotePluginTestRunner.java:62) 
at org.eclipse.pde.internal.junit.runtime.PlatformUITestHarness$1.run(PlatformUITestHarness.java:47) 
at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) 
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:135) 
at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4140) 
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3757) 
at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2696) 
at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2660) 
at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2494) 
at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:674) 
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) 
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:667) 
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149) 
at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:123) 
at org.eclipse.pde.internal.junit.runtime.NonUIThreadTestApplication.runApp(NonUIThreadTestApplication.java:54) 
at org.eclipse.pde.internal.junit.runtime.UITestApplication.runApp(UITestApplication.java:41) 
at org.eclipse.pde.internal.junit.runtime.NonUIThreadTestApplication.start(NonUIThreadTestApplication.java:48) 
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) 
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110) 
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79) 
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:344) 
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622) 
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:577) 
at org.eclipse.equinox.launcher.Main.run(Main.java:1410) 
at org.eclipse.equinox.launcher.Main.main(Main.java:1386) 

은 내가 MANIFEST.MF
에 런타임에서 클래스 경로에 라이브러리로 Test.Util을 구성하고 이러한 플러그인의 모든 패키지를 수출 (A 정상의 JUnit 테스트는이 오류가 발생하지 않습니다). Eclipse에서 올바른 라이브러리는 TestCase에서 링크됩니다.

또한 @ RunWith 대신 JUnit-Rule을 사용하여 부트 스트랩을 사용했지만 동일한 ClassNotFoundException이 발생합니다. 문제는 변하지 않았습니다.

플러그인 테스트의 실행 구성을 다시 구성하고 매니페스트, 지연/비 지연로드시 ClassPath :. \를 설정하고 PluginTest 및 테스트에 대한 Buddy-ClassLoading을 설정했습니다. Util-Plugin.

웹에서 시도하고 검색 한 후에도 Powellock이 Test-Plugin에서 추출한 플러그인을 세 번째 플러그인으로 추출한 경우 Powermock이이 예외로 이어지는 이유는 아직 없습니다. 내 응용 프로그램에서 잘못 구성된 것이 있다면 현재 말할 수 없습니다.

동일하거나 유사한 문제가 발생했거나 해결 방법이 좋은 사람은 누구입니까?

답변

1

단일 플러그인에 저장된 PowerMock 라이브러리를 사용하여 pde plugin 테스트를 성공적으로 실행할 수 있었기 때문에 이전 주석을 삭제했습니다. 예제를 사용하여 질문에 대답하려면 Test.Util (플러그인 ID에 upercase를 사용하면 안됨) MANIFEST에 다음 줄을 추가해야합니다.그런 다음 MF

Eclipse-BuddyPolicy: registered 

당신이 MANIFEST.MF

Eclipse-RegisterBuddy: Test.Util 

의에 PluginTest 번들의 조각입니다 PluginObject 당신이해야하는 경우 일반 플러그인이 다음 줄을 추가한다 PluginTest 플러그인을 사용하는 경우 PluginObject 매니페스트 인 호스트 번들에 이전 행을 추가합니다. 호프가 도움이 되길 바랍니다.)

3

"등록 된"정책이 제 경우에는 도움이되지 않았으며, 모든 플러그인을 util 플러그인으로 등록하고 싶지 않았습니다.

이클립스 (Eclipse) BuddyPolicy : 의존, 등록, 글로벌, 응용 프로그램 PowerMockito 사용할 더 많거나 적은 모든 클래스를 만드는

을 나를 위해이 솔루션은 선언 "Test.Util"에 있었다.

1

적절한 OSGI 매니페스트 및 OSGI 종속성이있는 Powermock 버전이 필요합니다. 이제 Powermock 1.5.4 용 P2 업데이트 사이트가 포함 된 작은 프로젝트를 시도해 볼 수 있습니다. https://code.google.com/p/powermock/ OSGI 섹션 (직접 링크 : https://code.google.com/p/powermock-osgi)을 참조하십시오.

OSGI 환경에서 은 내 보낸 패키지에있는 Powermock 만 사용하여 클래스를 조작 할 수 있습니다. 이것은 어떤 보낸 패키지가 Powermock에 액세스 할 수 있음을, basicly 의미

Eclipse-BuddyPolicy: global,ext,boot 

: 내 P2 업데이트 사이트에서 당신은있는 Powermock을 찾을 수 있습니다. 여전히 테스트 된 패키지를 내 보내야합니다. 모든 번들에 대해 패키지를 공개하지 않으려는 경우에도 매니페스트에 X-Friends 지시어를 사용할 수 있습니다. Powermock을 사용하여 X-Friend로 패키지를 내 보낸다면 그게 전부입니다.

UPDATE :

Interesing, 당신은 PowerMock가 수출 클래스를 조작 할 경우에만 수있는 이유를 설명 할 수 Chriss의 질문에 대한 대답? 현재 나의 이해는 런타임에 모든 패키지가 보이고 빌드/컴파일시에만 중요하다는 것입니다. 당신이 OSGI의 클래스 런타임을 얻기 위해() Class.forName을 사용하는 경우

, 당신은 당신의 이름의 클래스를 얻기 위해 번들 클래스 로더를 사용합니다. 이 번들 클래스 로더는 가져온 패키지에있는 클래스 만 볼 수 있습니다. Powermock 번들에는 동적 가져 오기가 있지만 Powermock 번들의 클래스 로더는 모든 번들의 내 보낸 패키지의 클래스 만 표시합니다.

클래스가 어디에서 왔는지 알 수 있다면 해당 클래스가 내 보내준 번들은 해당 번들의 클래스 로더를 가져올 수 있으며 해당 클래스 로더에서 검색된 클래스를 가져올 수 있습니다. 물론 이것은 꽤 복잡하고 Powermock 번들에는이 세부 사항을 숨기는 일부 해킹 마법 클래스 로더가 필요하지만 그런 것은 존재하지 않는다는 것을 의미합니다. 자세한 내용은 http://olegz.wordpress.com/2008/11/05/osgi-and-classforname/

+1

Interesing를 참조하십시오

, 당신은 PowerMock 내 보낸 클래스를 조작 할 경우에만 수있는 이유를 설명 할 수 있습니까? 현재 나의 이해는 모든 패키지가 빌드/컴파일시에만 중요하다는 것이다. – Chriss

+1

내 업데이트를 확인하십시오. –

+1

이걸 살펴볼 수 있습니까? http://stackoverflow.com/questions/22456767/noclassdeffounderror-org-hamcrest-matchers-using-powermock-osgi – Chriss

관련 문제