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
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
@Smartmarkey Une autre idée m'est venue à l'esprit. – MaDa