2011-09-29 17 views
6

Oto moja sprawa. Mam klasę AbstractController. Ma kontroler podklasy. W jednej z metod programu AbstractController tworzona jest nowa instancja ApplicationLock. Chciałbym kpić z ApplicationLock podczas pisania ut dla kontrolera. Napisałem testowy przykład jak poniżej.Wystąpił wyjątek ExceptionInInitializerError podczas kpiny z klasy klasy Powermock. Jak to naprawić?

@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); 
} 

Dodałem niezbędne adnotacje do klasy testowej.

@RunWith (PowerMockRunner.class)

@PrepareForTest ({AbstractController.class})

Ale mam następujący błąd podczas uruchamiania tej sprawy testowej. To jest statyczny inicjator w AbstractController.

Spowodowane. Java.lang.NullPointerException w com.acompany.controller.common.AbstractController (AbstractController.java:65)

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

całego stosu śladowy, jak poniżej.

java.lang.ExceptionInInitializerError na java.lang.Class.forName0 (metoda podstawowa) na java.lang.Class.forName (Class.java:169) w javassist.runtime.Desc.getClassObject (Desc.java:44) pod javassist.runtime.Desc.getClassType (Desc.java:153) pod javassist.runtime.Desc.getType (Desc.java:123) pod javassist.runtime.Desc.getType (Opis. java: 79) at com.acompany.controller.portfolio.ControllerTest.testIncrementalFail (ControllerTest.java:195) w sun.reflect.NativeMethodAccessorImpl.invoke0 (Metoda macierzysta) pod adresem sun.reflect.NativeMethodAccessorImpl. wywołania (NativeMethodAccessorImpl.java:39) w sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:25) w java.lang.reflect.Method.invoke (Method.java:597) w org.junit.internal .runners.TestMethod.invoke (TestMethod.java:66) w org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl $ PowerMockJUnit44MethodRunner.runTestMethod (PowerMockJUnit44RunnerDelegateImpl.java:307) w org.junit.internal.runners. MethodRoadie $ 2.run (MethodRoadie.java:86) na org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters (MethodRoadie.java:94) na org.powermock.modules.junit4.internal.impl.PowerMockJUn it44RunnerDelegateImpl $ PowerMockJUnit44MethodRunner.executeTest (PowerMockJUnit44RunnerDelegateImpl.java:294) na org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl $ PowerMockJUnit47MethodRunner.executeTestInSuper (PowerMockJUnit47RunnerDelegateImpl.java:112) w org.powermock.modules.junit4. internal.impl.PowerMockJUnit47RunnerDelegateImpl $ PowerMockJUnit47MethodRunner.executeTest (PowerMockJUnit47RunnerDelegateImpl.java:73) na org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl $ PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters (PowerMockJUnit44RunnerDelegateImpl.java:282) w org.junit. internal.runners.MethodRoadie.runTest (MethodRoadie.java:84) a t org.junit.internal.runners.MethodRoadie.run (MethodRoadie.java:49) w org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod (PowerMockJUnit44RunnerDelegateImpl.java:207) w org.powermock.modules.junit4.internal.impl. PowerMockJUnit44RunnerDelegateImpl.runMethods (PowerMockJUnit44RunnerDelegateImpl.java:146) na org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl $ 1.run (PowerMockJUnit44RunnerDelegateImpl.java:120) w org.junit.internal.runners.ClassRoadie.runUnprotected (ClassRoadie.java:34) pod adresem org.junit.internal.runners.ClassRoadie.runProtected (ClassRoadie.java:44) pod lub g.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run (PowerMockJUnit44RunnerDelegateImpl.java:118) w org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run (JUnit4TestSuiteChunkerImpl.java:102) w org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run (AbstractCommonPowerMockRunner.java:53) w org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run (JUnit4TestReference.java:49) w org.eclipse.jdt.internal.junit.runner.TestExecution.run (TestExecution.java:38) w org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:467) w org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:683) w org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run (RemoteTestRunner.java:390) pod adresem org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main (RemoteTestRunner.java:197) Spowodowane przez: java.lang.NullPointerException pod adresem com.acompany.controller.common.AbstractController. (AbstractController.java: 65) ... 35 więcej

Odpowiedz

3

można użyć wtedy:

@SuppressStaticInitializationFor({AbstractController.class}) 

A potem, w przypadku testu ustawić ręcznie wszystkie pola statyczne, które muszą być inicjowane, w tym DEFAULT_FOLDER:

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

Sposób Class<?>.getProtectionDomain() zależy zbytnio na ładującego klasy używane, więc prawdopodobnie nie będzie zmusić go do pracy w JUnit/PowerMock, które używają własnych.

+0

Dzięki. Próbowałem tego. Ale nie mogę ukryć wszystkich statycznych inicjalizatorów w AbstractController. Jeśli to zrobię, otrzymam wskaźnik zerowy. – Smartmarkey

+0

@Smartmarkey Przyszedł mi do głowy kolejny pomysł. – MaDa

Powiązane problemy