2011-09-29 13 views
6

यहां मेरा मामला है। मेरे पास एक सार नियंत्रक वर्ग है। इसमें एक उप-वर्ग नियंत्रक है। सार नियंत्रक के तरीकों में से एक में एक नया एप्लीकेशन लॉक तत्काल है। नियंत्रक के लिए लिखते समय मैं एप्लिकेशन लॉक को मॉक करना चाहता हूं। मैंने नीचे एक टेस्ट केस लिखा था।पॉटरमॉक के साथ कक्षा के कन्स्ट्रक्टर का मज़ाक उड़ाते समय एक्सेप्शनइनइनिलाइज़र त्रुटि प्राप्त करें। इसे कैसे जोड़ेंगे?

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

मैंने टेस्ट क्लास में आवश्यक एनोटेशन जोड़े हैं।

@RunWith (PowerMockRunner.class)

@PrepareForTest ({} AbstractController.class)

लेकिन जब इस परीक्षण का मामला चल रहा है मैं निम्नलिखित त्रुटि मिली। यह सार नियंत्रक में एक स्थिर प्रारंभकर्ता है।

की वजह से:। Com.acompany.controller.common.AbstractController पर java.lang.NullPointerException (AbstractController.java:65)

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

पूर्ण स्टैक ट्रेस रूप में नीचे है।

java.lang.Class.forName0 (मूल निवासी विधि) java.lang.Class.forName (Class.java:169) पर javassist.runtime.Desc.getClassObject पर पर java.lang.ExceptionInInitializerError (Desc.java:44) javassist.runtime.Desc.getClassType (Desc.java:153) पर javassist.runtime.Desc.getType (Desc.java:123) javassist.runtime.Desc.getType (Desc। जावा: 7 9) com.acompany.controller.portfolio.ControllerTest.testIncrementalFail (ControllerTest.java:195) sun.reflect.NativeMethodAccessorImpl.invoke0 (मूल विधि) sun.reflect.NativeMethodAccessorImpl पर। आह्वान org.junit.internal पर (NativeMethodAccessorImpl.java:39) sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:25) पर java.lang.reflect.Method.invoke (Method.java:597) पर .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) ए टी 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) org.junit.internal.runners.ClassRoadie.run संरक्षित (ClassRoadie.java:44) पर या 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) पर पर । com.acompany.controller.common.AbstractController पर java.lang.NullPointerException (AbstractController.java: org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main (RemoteTestRunner.java:197) की वजह से है: 65) ... 35 अधिक

उत्तर

3

फिर आप इस्तेमाल कर सकते हैं:

@SuppressStaticInitializationFor({AbstractController.class}) 

और फिर, अपने परीक्षण मामले में, मैन्युअल रूप से सभी स्थिर क्षेत्रों की जरूरत है कि निर्धारित करते हैं, DEFAULT_FOLDER सहित प्रारंभ करने के लिए:

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

विधि Class<?>.getProtectionDomain() वर्ग लोडर पर बहुत अधिक निर्भर करता है के लिए इस्तेमाल किया है, तो आप शायद नहीं होगा इसे जुनीट/पावरमोक में काम करने के लिए प्राप्त करें, जो स्वयं का उपयोग करते हैं।

+0

धन्यवाद। मैंने कोशिश की है लेकिन मैं सार नियंत्रक में सभी स्थिर प्रारंभकर्ताओं को दबाने नहीं कर सकता। अगर मैं ऐसा करता हूं तो मुझे शून्य सूचक मिलेगा। – Smartmarkey

+0

@Smartmarkey एक और विचार मेरे लिए हुआ। – MaDa

संबंधित मुद्दे

 संबंधित मुद्दे