2011-09-29 16 views
6

Aquí está mi caso. Tengo una clase de AbstractController. Tiene un controlador de clase secundaria. En uno de los métodos de AbstractController, se crea una instancia de un nuevo ApplicationLock. Me gustaría burlar ApplicationLock cuando escribo ut para Controller. Escribí un caso de prueba como a continuación.Obtuvo ExceptionInInitializerError al burlarse del constructor de una clase con Powermock. ¿Como arreglarlo?

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

Agregué las anotaciones necesarias a la clase de prueba.

@RunWith (PowerMockRunner.class)

@PrepareForTest ({} AbstractController.class)

Pero tengo el siguiente error cuando se ejecuta este caso de prueba. Es un inicializador estático en AbstractController.

Causado por:. Java.lang.NullPointerException en com.acompany.controller.common.AbstractController (AbstractController.java:65)

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

seguimiento de la pila completa es como sigue.

java.lang.ExceptionInInitializerError en java.lang.Class.forName0 (Nativo Método) en Java.Lang.Class.forName (Class.java:169) en javassist.runtime.Desc.getClassObject (Desc.java:44) en javassist.runtime.Desc.getClassType (Desc.java:153) en javassist.runtime.Desc.getType (Desc.java:123) en javassist.runtime.Desc.getType (Desc. java: 79) al com.acompany.controller.portfolio.ControllerTest.testIncrementalFail (ControllerTest.java:195) en sun.reflect.NativeMethodAccessorImpl.invoke0 (nativo Método) en sun.reflect.NativeMethodAccessorImpl. invocar (NativeMethodAccessorImpl.java:39) en sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:25) en java.lang.reflect.Method.invoke (Method.java:597) en org.junit.internal .runners.TestMethod.invoke (TestMethod.java:66) en org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl $ PowerMockJUnit44MethodRunner.runTestMethod (PowerMockJUnit44RunnerDelegateImpl.java:307) en org.junit.internal.runners. MethodRoadie $ 2.run (MethodRoadie.java:86) en org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters (MethodRoadie.java:94) en org.powermock.modules.junit4.internal.impl.PowerMockJUn it44RunnerDelegateImpl $ PowerMockJUnit44MethodRunner.executeTest (PowerMockJUnit44RunnerDelegateImpl.java:294) en org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl $ PowerMockJUnit47MethodRunner.executeTestInSuper (PowerMockJUnit47RunnerDelegateImpl.java:112) en org.powermock.modules.junit4. internal.impl.PowerMockJUnit47RunnerDelegateImpl $ PowerMockJUnit47MethodRunner.executeTest (PowerMockJUnit47RunnerDelegateImpl.java:73) en org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl $ PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters (PowerMockJUnit44RunnerDelegateImpl.java:282) en org.junit. internal.runners.MethodRoadie.runTest (MethodRoadie.java:84) a t org.junit.internal.runners.MethodRoadie.run (MethodRoadie.java:49) en org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod (PowerMockJUnit44RunnerDelegateImpl.java:207) en org.powermock.modules.junit4.internal.impl. PowerMockJUnit44RunnerDelegateImpl.runMethods (PowerMockJUnit44RunnerDelegateImpl.java:146) en org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl $ 1.run (PowerMockJUnit44RunnerDelegateImpl.java:120) en org.junit.internal.runners.ClassRoadie.runUnprotected (ClassRoadie.java:34) en org.junit.internal.runners.ClassRoadie.runProtected (ClassRoadie.java:44) en o g.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run (PowerMockJUnit44RunnerDelegateImpl.java:118) en org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run (JUnit4TestSuiteChunkerImpl.java:102) en org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run (AbstractCommonPowerMockRunner.java:53) en org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run (JUnit4TestReference.java:49) en org.eclipse.jdt.internal.junit.runner.TestExecution.run (TestExecution.java:38) en org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:467) en org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:683) en org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run (RemoteTestRunner.java:390) en org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main (RemoteTestRunner.java:197) Causado por: java.lang.NullPointerException en com.acompany.controller.common.AbstractController. (AbstractController.java: 65) ... 35 más

Respuesta

3

Usted podría utilizar a continuación:

@SuppressStaticInitializationFor({AbstractController.class}) 

Y entonces, en el caso de test, establecer manualmente todos los campos estáticos que deben ser inicializados, incluyendo el DEFAULT_FOLDER:

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

El método Class<?>.getProtectionDomain() depende demasiado de cargador de clases utilizado, por lo que probablemente no lo hará haz que funcione en JUnit/PowerMock, que usa el suyo.

+0

Gracias. Lo intenté Pero no puedo suprimir todos los inicializadores estáticos en AbstractController. Obtendré un puntero nulo si lo hago. – Smartmarkey

+0

@Smartmarkey Se me ocurrió otra idea. – MaDa

Cuestiones relacionadas