2014-04-23 5 views
18

मेरे पास कक्षा A है जिसे परीक्षण की आवश्यकता है।मॉकिटो का उपयोग एक विधि के स्थानीय चर को मॉक करने के लिए

public class A { 
    public void methodOne(int argument) { 
     //some operations 
     methodTwo(int argument); 
     //some operations 
    } 

    private void methodTwo(int argument) { 
     DateTime dateTime = new DateTime(); 
     //use dateTime to perform some operations 
    } 
} 

और dateTime मूल्य कुछ डेटा, चालाकी करने डेटाबेस से लिया गया है के आधार पर: निम्नलिखित A की परिभाषा है। इस डेटाबेस के लिए, मान JSON फ़ाइल के माध्यम से जारी रहे हैं।

यह चीजों को जटिल बनाता है। मुझे इसकी आवश्यकता होने पर dateTime को किसी विशिष्ट तारीख पर सेट करने की आवश्यकता है। क्या कोई तरीका है कि मैं मॉकिटो का उपयोग कर स्थानीय चर के मूल्य का नकल कर सकता हूं?

+0

[मॉकिटो के साथ स्थानीय स्कोप ऑब्जेक्ट्स के मॉकिंग विधियों के संभावित डुप्लिकेट] (http://stackoverflow.com/questions/6520242/mocking-methods-of-local-scope-objects-with-mockito) – zubergu

+0

कोई अन्य नहीं इस विषय पर मिले प्रश्नों में अमूर्तता की अतिरिक्त परत थी। इसके अलावा, उनमें से अधिकांश ने मॉक क्लास की कुछ विधि के माध्यम से स्थानीय चर को तुरंत चालू कर दिया। – user657592

उत्तर

18

आप स्थानीय चर का नकल नहीं कर सकते हैं।

public class A { 
    public void methodOne(int argument) { 
    //some operations 
    methodTwo(int argument); 
    //some operations 
    } 

    private void methodTwo(int argument) { 
    DateTime dateTime = createDateTime(); 
    //use dateTime to perform some operations 
    } 

    protected DateTime createDateTime() { 
    return new DateTime(); 
    } 
} 

public class ATest { 
    @Test 
    public void testMethodOne() { 
    DateTime dt = new DateTime (/* some known parameters... */); 
    A a = Mockito.spy(new A()); 
    doReturn(dt).when(a).createDateTime(); 
    int arg = 0; // Or some meaningful value... 
    a.methodOne(arg); 
    // assert the result 
} 
+6

मैं संरक्षित createDateTime() विधि लिखना नहीं चाहता हूं। क्या इसके बारे में जाने का कोई और तरीका नहीं है? – user657592

+0

असल में आपको Mockito.doReturn (dt) का उपयोग करना होगा। (ए) .createDateTime() कृपया https://stackoverflow.com/questions/11620103/mockito-trying-to-spy-on-method-is-calling देखें -the-original-method – Alex

+1

यह निश्चित रूप से सही @Alex है, ध्यान देने के लिए धन्यवाद! संपादित और तय। – Mureinik

2

ऐसी समस्या से निपटने के लिए सबसे अच्छा तरीका है दिनांक समय के नए उदाहरणों प्राप्त करने के लिए एक इंजेक्शन Clock सेवा के उपयोग किए उपयोग करने के लिए है: आप क्या कर सकते हैं, हालांकि, एक protected विधि के लिए इसके निर्माण निकालने और spy यह है । इस तरह, आपका परीक्षण एक नकली घड़ी इंजेक्ट कर सकता है, जो वर्तमान समय के बजाय एक विशिष्ट दिनांक समय देता है।

ध्यान दें कि नया जावा 8 टाइम एपीआई विशेष रूप से उस उद्देश्य के लिए Clock class परिभाषित करता है।

+0

इसके लिए एक jdk1.8 की आवश्यकता है, है ना? मैं वर्तमान में 1.7 पर हूं और जल्द ही अपग्रेड करने की योजना नहीं बना रहा हूं। – user657592

+1

नहीं। आपको अपने स्वयं के क्लॉक क्लास या इंटरफ़ेस को परिभाषित करने की आवश्यकता है, और वर्तमान समय प्राप्त करने के लिए 'new DateTime()' के बजाय 'clock.newDateTime()' पर कॉल करें। –

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

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