2011-09-29 5 views
6

私の場合です。私はAbstractControllerクラスを持っています。コントローラにはサブクラスがあります。 AbstractControllerのメソッドの1つでは、新しいApplicationLockがインスタンス化されます。私はControllerのためのutを書くときApplicationLockを模擬したいと思う。私は以下のようなテストケースを書いた。Powermockでクラスのコンストラクタをモックすると、ExceptionInInitializerErrorが発生します。それを修正するには?

@test 
public void testMethod(){ 
    ApplicationLock mockLock=PowerMockito.mock(ApplicationLock.class); 
    PowerMockito.when(mockLock.tryObtain()).thenReturn(true); 
    PowerMockito.whenNew(ApplicationLock.class).withArguments(argThat(new IsFile()),anyString()).thenReturn(mockLock); 
} 

テストクラスに必要な注釈を追加しました。

@RunWith(PowerMockRunner.class)

@PrepareForTest({AbstractController.class})

しかし、このテストケースを実行しているとき、私は、次のエラーを得ました。これはAbstractControllerの静的初期化子です。

によって引き起こさ:。com.acompany.controller.common.AbstractControllerでjava.lang.NullPointerExceptionが (AbstractController.java:65)

private static final String DEFAULT_FOLDER = AbstractController.class.getProtectionDomain().getCodeSource() 
      .getLocation().getPath(); 

のフルスタックトレースは以下の通りです。

javassist.runtime.Desc.getClassObject(AT java.lang.Class.forName(Class.java:169)で java.lang.Class.forName0(ネイティブメソッド)でjava.lang.ExceptionInInitializerError (Desc.java:44)at javassist.runtime.Desc.getClassType(Desc.java:153)at javassist.runtime.Desc.getType(Desc.java:123)at javassist.runtime.Desc.getType(バージョン9.0.0以上が必要です)をダウンロードしてください。 java:79)at com.acompany.controller.portfolio.ControllerTest.testIncrementalFail(ControllerTest.java:195) at sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド) sun.reflect.NativeMethodAccessorImpl。起動 org.junit.internalでjava.lang.reflect.Method.invoke(Method.java:597)で sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)で(NativeMethodAccessorImpl.java:39) org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl $ PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:307) org.junit.internal.runnersで で.runners.TestMethod.invoke(TestMethod.java:66)。 MethodRoadie $ 2.run(MethodRoadie.java:86) org.powermock.modules.junit4.internal.impl.PowerMockJUnで org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:94) で it44RunnerDelegateImpl $ PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:294) でorg.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl $ PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:112) org.powermock.modules.junit4で。 internal.impl.PowerMockJUnit47RunnerDelegateImpl $ PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:73) でorg.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl $ PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:282) org.junitで。 internal.runners.MethodRoadie.runTest(MethodRoadie.java:84) a t org.junit.internal.runners。MethodRoadie.run(MethodRoadie.java:49) でorg.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:207) org.powermock.modules.junit4.internal.implで 。 org.junit.internal.runners.ClassRoadie.runUnprotectedでPowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:146) org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl $ 1.run(PowerMockJUnit44RunnerDelegateImpl.java:120) で (ClassRoadie.java:34) を org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44) を または org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:102)でg.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:118) org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.runで でorg.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53) (JUnit4TestReference.java:49 ) でorg.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467で) org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)で で でorg.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) に起因: com.acompany.controller.common.AbstractControllerでjava.lang.NullPointerExceptionが(AbstractController.java。 65) ...もっと35

答えて

3

あなたはその後、使用することができます

@SuppressStaticInitializationFor({AbstractController.class}) 

そして、あなたのテストケースには、手動でDEFAULT_FOLDER含めて初期化する必要があるすべての静的フィールド、設定:メソッドClass<?>.getProtectionDomain()

Whitebox.setInternalState(Controller.class, "DEFAULT_FOLDER", "abcd"); 
Whitebox.setInternalState(Controller.class, "OTHER_FIELD", new Object()); 

が使用するクラスローダにあまり依存するため、あなたはおそらくないでしょう独自のJUnit/PowerMockで動作させることができます。

+0

ありがとうございました。私はそれを試した。しかし、私はAbstractControllerですべての静的初期化子を抑制することはできません。もしそうすれば私はnullポインタを取得します。 – Smartmarkey

+0

@Smartmarkey別の考えが私に起こりました。 – MaDa