2011-09-29 8 views
6

İşte benim durumum. Bir AbstractController sınıfım var. Alt sınıf bir denetleyiciye sahiptir. AbstractController yöntemlerinden birinde yeni bir ApplicationLock uygulaması başlatılır. Controller için ut yazarken ApplicationLock ile uğraşmak istiyorum. Aşağıda olduğu gibi bir test vakası yazdım.Powermock ile bir sınıfın yapıcısını alay ederken ExceptionInInitializerError var. Nasıl düzeltilir?

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

Test sınıfına gerekli ek notları ekledim.

@RunWith (PowerMockRunner.class)

@PrepareForTest ({AbstractController.class})

Ama bu test vakası çalıştırırken aşağıdaki hata var. Bu, AbstractController'da bir statik başlatıcıdır.

Neden Olduğu:. Com.acompany.controller.common.AbstractController de java.lang.NullPointerException (AbstractController.java:65)

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

Tam yığın izlemesi aşağıdaki gibidir. javassist.runtime.Desc.getClassObject de java.lang.Class.forName (Class.java:169) en java.lang.Class.forName0 (Ana Yöntemi) en

java.lang.ExceptionInInitializerError ( javassist.runtime.Desc.getClassType (Desc.java:153) adresinden javassist.runtime.Desc.getType (Desc.java:123) adresinden javassist.runtime.Desc.getType (Desc. java: 79) sun.reflect.NativeMethodAccessorImpl de sun.reflect.NativeMethodAccessorImpl.invoke0 de com.acompany.controller.portfolio.ControllerTest.testIncrementalFail (ControllerTest.java:195) (Ana yöntemi). çağırmak org.junit.internal de java.lang.reflect.Method.invoke (Method.java:597) en sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:25) 'den (NativeMethodAccessorImpl.java:39) org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl $ PowerMockJUnit44MethodRunner.runTestMethod (PowerMockJUnit44RunnerDelegateImpl.java:307) org.junit.internal.runners en de .runners.TestMethod.invoke (TestMethod.java:66). org.powermock.modules.junit4.internal.impl.PowerMockJUn de org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters (MethodRoadie.java:94) de MethodRoadie $ 2.run (MethodRoadie.java:86) org.powermock.modules.junit4 de org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl $ PowerMockJUnit47MethodRunner.executeTestInSuper (PowerMockJUnit47RunnerDelegateImpl.java:112) de it44RunnerDelegateImpl $ PowerMockJUnit44MethodRunner.executeTest (PowerMockJUnit44RunnerDelegateImpl.java:294) . org.junit de org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl $ PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters (PowerMockJUnit44RunnerDelegateImpl.java:282) de internal.impl.PowerMockJUnit47RunnerDelegateImpl $ PowerMockJUnit47MethodRunner.executeTest (PowerMockJUnit47RunnerDelegateImpl.java:73) . internal.runners.MethodRoadie.runTest (MethodRoadie.java:84) a t org.junit.internal.runners.MethodRoadie.run org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod (PowerMockJUnit44RunnerDelegateImpl.java:207) 'den (MethodRoadie.java:49) org.powermock.modules.junit4.internal.impl de . org.junit.internal.runners.ClassRoadie.runUnprotected de PowerMockJUnit44RunnerDelegateImpl.runMethods (PowerMockJUnit44RunnerDelegateImpl.java:146) org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl $ 1.run (PowerMockJUnit44RunnerDelegateImpl.java:120) de (ClassRoadie.java:34) , org.junit.internal.runners.ClassRoadie.runProtected (ClassRoadie.java:44) , veya org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run (JUnit4TestSuiteChunkerImpl.java:102) de g.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run (PowerMockJUnit44RunnerDelegateImpl.java:118) org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run de org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run (AbstractCommonPowerMockRunner.java:53) (JUnit4TestReference.java:49 de org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests de org.eclipse.jdt.internal.junit.runner.TestExecution.run (TestExecution.java:38 de) ) (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) en de org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main (RemoteTestRunner.java:197) Nedeniyle: java.lang.NullPointerException com.acompany.controller.common.AbstractController. (AbstractController.java: 65) ... daha 35

cevap

3

ardından kullanabilirsiniz:

@SuppressStaticInitializationFor({AbstractController.class}) 

Ve sonra, test durumda, gerek manuel olarak ayarlama tüm statik alanlar DEFAULT_FOLDER dahil ilk haline getirilmesinin:, yöntem Class<?>.getProtectionDomain() sınıf yükleyici üzerinde çok fazla bağlıdır

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

kullanılan böylece muhtemelen gelmeyecek JUnit/PowerMock'ta çalışmayı kendi başlarına kullanın.

+0

Teşekkürler. Denedim. Ancak, AbstractController'daki tüm statik başlatıcıları basamıyorum. Eğer yaparsam boş gösterici alırım. – Smartmarkey

+0

@Smartmarkey Bana başka bir fikir geldi. – MaDa

İlgili konular