2012-09-14 21 views
6
public class TestStatic { 
    public static int methodstatic(){ 
     return 3; 
    } 
} 


@Test 
@PrepareForTest({TestStatic.class}) 
public class TestStaticTest extends PowerMockTestCase { 

    public void testMethodstatic() throws Exception { 
     PowerMockito.mock(TestStatic.class); 
     Mockito.when(TestStatic.methodstatic()).thenReturn(5); 
     PowerMockito.verifyStatic(); 
     assertThat("dff",TestStatic.methodstatic()==5); 
    } 

    @ObjectFactory 
    public IObjectFactory getObjectFactory() { 
     return new org.powermock.modules.testng.PowerMockObjectFactory(); 
    } 
} 

अपवाद:PowerMock स्थिर वर्ग नकली नहीं है

org.mockito.exceptions.misusing.MissingMethodInvocationException: 
when() requires an argument which has to be 'a method call on a mock'. 
For example: 
    when(mock.getArticles()).thenReturn(articles); 

Also, this error might show up because: 
1. you stub either of: final/private/equals()/hashCode() methods. 
Those methods *cannot* be stubbed/verified. 
2. inside when() you don't call method on mock but on some other object. 

मैं Intellij के माध्यम से चला रहा हूँ, विरासत कोड तरीकों के बहुत सारे है ...

किसी ने की है और विचार, मैं चला गया आधिकारिक tuto के माध्यम से, कोई मतलब इस सरल

उत्तर

0

काम कर परीक्षण करने के लिए इस उत्तर पर एक नज़र डालें: Mocking Logger and LoggerFactory with PowerMock and Mockito

यदि आप स्थिर कॉल स्टब करना चाहते हैं तो Mockito.when का उपयोग नहीं करना चाहिए, लेकिन PowerMockito.when

स्टेटिक्स एक टेस्टेबिलिटी दुःस्वप्न है, आप जितना संभव हो उससे बचें, और अपने डिजाइन को फिर से तैयार करने के लिए या फिर अपने उत्पादन कोड का परीक्षण करने में सक्षम होने के लिए PowerMock चाल का उपयोग न करने के लिए अपने डिजाइन को फिर से तैयार करें।

उम्मीद है कि मदद करता है।

चीयर्स, ब्राईस

+0

धन्यवाद, हाँ, आप विरासत कोड का चयन नहीं करते हैं :), लेकिन आप रिफैक्टर कर सकते हैं ... बीमार स्थिर मॉक करें और नकली पैटर्न लागू करें। – Sam

+0

सहमत विरासत कोड एक दर्द है, PowerMock वास्तव में इस मामले में शक्तिशाली है :) – Brice

+1

यह सच नहीं है: "अगर आप स्थिर कॉल को स्टब करना चाहते हैं तो आपको 'मॉकिटो' का उपयोग नहीं करना चाहिए। PowerMockito उपयोग पृष्ठ अपने उदाहरण कोड में 'Mockito.when' का उपयोग करता है। – ach

3

मैं विरासत कोड के अपने परीक्षण पर एक नज़र लिया और मैं देख सकता हूँ यह है कि आप PowerMockito.mockStatic(TestStatic.class) के बजाय PowerMockito.mock(TestStatic.class) कहते हैं। कोई फर्क नहीं पड़ता कि आप PowerMockito.when(...) या Mockito.when(...) का उपयोग करते हैं, क्योंकि पहला व्यक्ति केवल दूसरे स्थान पर जाता है।

एक और टिप्पणी: मैं समझता हूं कि शायद आपको विरासत कोड का परीक्षण करना होगा। हो सकता है कि आप जुनीट 4 शैली में ऐसा कर सकें, सिर्फ विरासत परीक्षण न करें? ब्रिस द्वारा उल्लिखित उदाहरण एक अच्छा है।

5

मैं अपने मामले में इस तरह के मुद्दे के लिए समाधान मिल गया है, इसे आपके साथ साझा करना चाहते हैं:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(Calendar.class) 
public class TestClass { 
    @Test 
    public void testGetDefaultDeploymentTime() 
    PowerMockito.mockStatic(Calendar.class); 
    Calendar calendar = new GregorianCalendar(); 
    calendar.set(Calendar.HOUR_OF_DAY, 8); 
    calendar.set(Calendar.MINUTE, 0); 
    when(Calendar.getInstance()).thenReturn(calendar); 
    Calendar.getInstance(); 
    } 
} 

यह ठीक काम किया:

मैं परीक्षण वर्ग में मज़ाक उड़ाया विधि कहा जाता है। लेकिन जब मैंने परीक्षण को फिर से लिखा, तो इसे किसी अन्य वर्ग में कैलेंडर.getInstance() कहा जाता है, यह वास्तविक कैलेंडर विधि का उपयोग करता है।

@Test 
public void testGetDefaultDeploymentTime() throws Exception { 
    mockUserBehaviour(); 
    new AnotherClass().anotherClassMethodCall(); // Calendar.getInstance is called here 
} 

तो, एक समाधान के रूप में मैं AnotherClass.class @PrepareForTest को जोड़ा गया है और अब यह काम करता है।

@PrepareForTest({Calendar.class, AnotherClass.class}) 

ऐसा लगता है कि पावरमैक को यह पता होना चाहिए कि मैक स्थैतिक विधि कहां से कॉल की जाएगी।

+0

हालांकि यह एक स्थिर विधि कॉल की तरह प्रतीत नहीं होता है, हालांकि आप ऑब्जेक्ट पर विधियों को कॉल कर रहे हैं जहां तक ​​मैं देख सकता हूं !!! –