2011-11-29 16 views
16

मैं विरासत में सुरक्षित विधि का नकल करना चाहता हूं। मैं इस विधि को सीधे जावा कोड से नहीं बुला सकता क्योंकि इसे कक्षा से विरासत में मिला है जो दूसरे पैकेज में है। मैं when(...)मॉकिंग संरक्षित विधि

package a; 

public class A() { 
    protected int m() {} 
} 

package b; 

public class B extends a.A { 
    // this class currently does not override m method from a.A 
    public asd() {} 
} 

// test 
package b; 

class BTest { 
    @Test 
    public void testClass() { 
     B instance = PowerMockito.spy(new B()); 
     PowerMockito.when(instance, <specify a method m>).thenReturn(123); 
     //PowerMockito.when(instance.m()).thenReturn(123); -- obviously does not work 
    } 
} 

मैं PowerMockito.when ओवरराइड को देखा में में ठूंठ इस विधि निर्दिष्ट करने के लिए एक तरह से नहीं मिल रहा है और यह लगता है कि वे निजी तरीकों के लिए ही सब कर रहे हैं!

संरक्षित विधि कैसे निर्दिष्ट करें?

+0

@AndroidKiller, कक्षा नाम के साथ अद्यतन कोड। असल में वे मॉकिटो से हो सकते हैं, लेकिन मैं पावरमॉक का उपयोग करता हूं और इन तरीकों का अर्थ है –

+0

यही कारण है कि हमें हमेशा विरासत पर रचना पसंद करना चाहिए। यदि आप अपने परीक्षण कोड में इस विधि को फिर से परिभाषित नहीं कर सकते हैं, जैसे आप विरासत कोड के साथ करेंगे। – Brice

उत्तर

24

संक्षेप: जासूसों को रोकने के लिए हमेशा when का उपयोग नहीं कर सकते; doReturn का उपयोग करें।

मान लिया जाये कि spy और doReturn के स्थिर आयात (दोनों PowerMockito):

@RunWith(PowerMockRunner.class) 
@PrepareForTest(B.class) 
public class BTest { 
    @Test public void testClass() throws Exception { 
     B b = spy(new B()); 
     doReturn(42).when(b, "m"); 
     b.asd(); 
    } 
} 

तुम भी @PrepareForTest(A.class) और ऊपर doReturnwhen(a, "m") पर सेट कर सकते हैं। जो अधिक समझ में आता है वास्तविक परीक्षण पर निर्भर करता है।

+0

वाह, धन्यवाद। दिलचस्प बात यह है कि जब मैंने विधि स्ट्रिंग नाम स्टबिंग के बजाय विधि उदाहरण का उपयोग करने का प्रयास किया तो तर्कों की गलत संख्या के बारे में अपवाद संदेश में विफल रहा। लेकिन स्ट्रिंग नाम के साथ सभी पूरी तरह से काम करता है। –

+0

@ मिशानेस्टेरेन्को हाँ, यह कभी-कभी थोड़ी गड़बड़ी कर सकता है। एक और विकल्प परीक्षण के प्रयोजनों के लिए हमेशा 'बी' subclassing है। हमेशा एक विकल्प नहीं है, लेकिन बाइटकोड को संशोधित करने से कम "जादुई";) –

+0

यदि आप मेथोड लौटने वाले शून्य को सेट करते हैं तो आप क्या करेंगे। मान लीजिए कि 'एम' एक सेट-मेथोड है जैसे शून्य एम (माईस्पेशनल पार्सर पार्सर)। इस पार्सर का उपयोग मेरे पाठ को पार्स करने के लिए किया जाता है। मैं इसे कैसे नकल कर सकता हूँ? – Kayser

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