2011-02-01 10 views
12

मैं PowerMock 1.4.7 और 4.8.2 JUnitPowerMock: स्थिर तरीकों में से मजाक (+ कुछ विशेष तरीकों में मूल मान)

का उपयोग मैं केवल कुछ स्थिर तरीकों उपहास करने के लिए की जरूरत है और मैं दूसरों चाहते हैं ( से एक ही कक्षा) सिर्फ मूल मूल्य वापस करने के लिए। जब मैं mockStatic के साथ नकली हूं और when().doReturn() पर कॉल न करें स्थैतिक विधियां अपना डिफ़ॉल्ट लौटाती हैं - जैसे ऑब्जेक्ट लौटने पर शून्य या बुलियन लौटने पर झूठी ... आदि। तो मैं thenCallRealMethod का उपयोग डिफ़ॉल्ट कार्यान्वयन (कोई मजाक नहीं/कोई नकली नहीं) लौटने के लिए प्रत्येक स्थिर विधि पर स्पष्ट रूप से उपयोग करने का प्रयास करता हूं, लेकिन मुझे पता नहीं है कि प्रत्येक संभावित तर्क विविधताओं पर इसे कैसे कॉल करें (= मैं हर संभव इनपुट कॉल के लिए चाहता हूं मूल विधि)। मैं केवल ठोस तर्क भिन्नता का नकल करने के बारे में जानता हूं।

उत्तर

27

आप अपने स्थिर वर्ग और नकली केवल विशिष्ट तरीकों पर एक जासूस का उपयोग कर सकते हैं:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(MyStaticTest.MyStaticClass.class) 
public class MyStaticTest { 

public static class MyStaticClass { 
    public static String getA(String a) { 
     return a; 
    } 
    public static String getB(String b) { 
     return b; 
    } 
} 

@Test 
public void should_partial_mock_static_class() throws Exception { 
    //given 
    PowerMockito.spy(MyStaticClass.class); 
    given(MyStaticClass.getB(Mockito.anyString())).willReturn("B"); 
    //then 
    assertEquals("A", MyStaticClass.getA("A")); 
    assertEquals("B", MyStaticClass.getA("B")); 
    assertEquals("C", MyStaticClass.getA("C")); 
    assertEquals("B", MyStaticClass.getB("A")); 
    assertEquals("B", MyStaticClass.getB("B")); 
    assertEquals("B", MyStaticClass.getB("C")); 
} 

} 
+1

हालांकि यह काम करता है, मैचर तर्कों का उपयोग करते समय सावधान रहें। यदि आप _Mockito.any() _ का उपयोग करना चाहते थे और आप एक जासूस की विधि को रोकने की कोशिश कर रहे हैं, तो वास्तविक getB() इम्प्लाइट स्टबिंग कथन के मूल्यांकन के दौरान लागू किया जाता है। अगर getB() शून्य तर्कों को संभालने में विफल रहता है, तो एक एनपीई फेंक दिया जाएगा। –

12

तुम भी छोटा करते एपीआई का उपयोग कर सकते हैं:

stub(method(MyStaticClass.class, "getB")).toReturn("B"); 

संपादित करें:

stub उपयोग करने के लिए और method इन पैकेजों से स्थैतिक रूप से आयात विधियां:

  1. org.powermock.api.support.membermodification.MemberModifier
  2. org.powermock.api.support.membermodification.MemberMatcher

के लिए और अधिक जानकारी documentation को देखें।

+0

यह दृष्टिकोण मेरे लिए काम करता था, लेकिन denis.solonenko का जवाब नहीं था। यह समझना मुश्किल है कि कब करें, कब, दिया, और स्टब का उपयोग करना है, जो सभी एक ही चीज़ के बारे में करने का दावा करते हैं। कभी-कभी प्रत्येक काम करता है और अन्य नहीं –

+0

इस दृष्टिकोण ने स्टेटिक क्लास के साथ आंशिक मॉकिंग करते समय मेरे लिए काम किया। – srinannapa

+1

धन्यवाद, कृपया 'स्टब' विधि स्कोप – Mrusful