2011-09-29 3 views
6

Voici mon cas. J'ai une classe AbstractController. Il a un contrôleur de sous classe. Dans une des méthodes de AbstractController, un nouveau ApplicationLock est instancié. Je voudrais me moquer de ApplicationLock en écrivant ut pour Controller. J'ai écrit un cas de test comme ci-dessous.Got ExceptionInInitializerError lors de la simulation du constructeur d'une classe avec Powermock. Comment le réparer?

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

J'ai ajouté les annotations nécessaires à la classe de test.

@RunWith (PowerMockRunner.class)

@PrepareForTest ({} AbstractController.class)

Mais je suis l'erreur suivante lors de l'exécution de ce cas de test. C'est un initialiseur statique dans AbstractController.

causés par:. Java.lang.NullPointerException à com.acompany.controller.common.AbstractController (AbstractController.java:65)

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

trace de la pile complète est comme ci-dessous.

java.lang.ExceptionInInitializerError à java.lang.Class.forName0 (Native Method) à java.lang.Class.forName (Class.java:169) à javassist.runtime.Desc.getClassObject (Desc.java:44) au javassist.runtime.Desc.getClassType (Desc.java:153) au javassist.runtime.Desc.getType (Desc.java:123) à javassist.runtime.Desc.getType (Desc. java: 79) à com.acompany.controller.portfolio.ControllerTest.testIncrementalFail (ControllerTest.java:195) à sun.reflect.NativeMethodAccessorImpl.invoke0 (méthode native) à sun.reflect.NativeMethodAccessorImpl. invoquer (NativeMethodAccessorImpl.java:39) à sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:25) à java.lang.reflect.Method.invoke (Method.java:597) à org.junit.internal .runners.TestMethod.invoke (TestMethod.java:66) à org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl PowerMockJUnit44MethodRunner.runTestMethod $ (PowerMockJUnit44RunnerDelegateImpl.java:307) à org.junit.internal.runners. MethodRoadie 2.run $ (MethodRoadie.java:86) à org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters (MethodRoadie.java:94) à org.powermock.modules.junit4.internal.impl.PowerMockJUn 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. PowerMockJUnit44RunnerDelegateImpl.runMethods (PowerMockJUnit44RunnerDelegateImpl.java:146) à org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl 1.run $ (PowerMockJUnit44RunnerDelegateImpl.java:120) à org.junit.internal.runners.ClassRoadie.runUnprotected (ClassRoadie.java:34) au org.junit.internal.runners.ClassRoadie.runProtected (ClassRoadie.java:44) au ou g.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run (PowerMockJUnit44RunnerDelegateImpl.java:118) à org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run (JUnit4TestSuiteChunkerImpl.java:102) à org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run (AbstractCommonPowerMockRunner.java:53) à org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run (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) causés par:. java.lang.NullPointerException à com.acompany.controller.common.AbstractController (AbstractController.java: 65) ... 35 plus

Répondre

3

Vous pouvez ensuite utiliser:

@SuppressStaticInitializationFor({AbstractController.class}) 

Et puis, dans votre cas de test, définissez manuellement tous les champs statiques qui doivent être initialisées, y compris le DEFAULT_FOLDER:

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

La méthode Class<?>.getProtectionDomain() dépend trop de chargeur de classe utilisé, de sorte que vous ne sera probablement pas faites-le fonctionner dans JUnit/PowerMock, qui utilise le leur.

+0

Merci. Je l'ai essayé. Mais je ne peux pas supprimer tous les initialiseurs statiques dans AbstractController. Je vais obtenir un pointeur nul si je le fais. – Smartmarkey

+0

@Smartmarkey Une autre idée m'est venue à l'esprit. – MaDa

Questions connexes