2012-02-23 15 views
5

हैलो मैं सरल समस्या से जूझ रहा हूं।जुनीट टेस्ट विधि जो एक ही ऑब्जेक्ट में अन्य विधियों का उपयोग करती है

जनरल विचार:

class Foo(){ 
    public boolean method1(); 
    public String method2(); 
    public String method3(); 
    public String shortcut(){ 
    return (method1() == true) ? method2() : method3(); 
    } 
} 

मैं शॉर्टकट विधि कैसे परीक्षण करना चाहिए?

मुझे पता है कि अन्य ऑब्जेक्ट का उपयोग करने वाली वस्तुओं और परीक्षण विधियों का नकल कैसे करें। नमूना:

class Car{ 
    public boolean start(){}; 
    public boolean stop(){}; 
    public boolean drive(int km){}; 
} 
class CarAutoPilot(){ 
    public boolean hasGotExternalDevicesAttached(){ 
    //Hardware specific func and api calls 
    //check if gps is available 
    //check if speaker is on 
    //check if display is on 
    } 
    public boolean drive(Car car, int km){ 
    //drive 
    boolean found = hasGotExternalDevicesAttached(); 
    boolean start = c.start(); 
    boolean drive = c.drive(km); 
    boolean stop = c.stop(); 
    return (found && start && drive && stop) == true; 
    } 
} 

class CarAutoPilotTest(){ 
    @Test 
    public void shouldDriveTenKm(){ 
    Car carMock = EasyMock.Create(Car.class); 
    EasyMock.expect(carMock.start()).andReturns(true); 
    EasyMock.expect(carMock.drive()).andReturns(true); 
    EasyMock.expect(carMock.stop()).andReturns(true); 
    EasyMock.reply(carMock);  

    CarAutoPilot cap = new CarAutoPilot(); 
    boolean result = cap.drive(cap,10); 
    Assert.assertTrue(result); 
    EasyMock.verify(carMock); 
    } 
} 

लेकिन क्या GotExternalDevicesAttached() विधि है? यह केवल नमूना असली परिदृश्य नहीं है। मुझे ड्राइव विधि का परीक्षण कैसे करना चाहिए? क्या मुझे यह भी मिलना चाहिए कि GotExternalDevicesAttached फ़ंक्शन?

क्या मैं परीक्षण की जा रही कक्षा का नकल कर सकता हूं?

+0

के लिए +1 चाहते हैं तो "मैं ड्राइव विधि कैसे परीक्षण करना चाहिए?" पनी सामान –

उत्तर

3

आप CarAutoPilot का उप-वर्ग बना सकते हैं जिसमें आप hasGotExternalDevicesAttached() ओवरराइड करते हैं, और इस सबक्लास के उदाहरण के साथ परीक्षण चलाते हैं।

आप इसे इनलाइन कर सकते हैं:

CarAutoPilot cap = new CarAutoPilot() { 
    public boolean hasGotExternalDevicesAttached(){ 
     // return true or false depending on what you want to test 
    } 
}; 

इस तरह आप CarAutoPilot के व्यवहार के आराम के लिए एक वैध इकाई परीक्षण बना सकते हैं।

आप एक गरीब आदमी का आंशिक नकली यह कॉल कर सकते हैं आप :-)

+0

इतना आसान :) धन्यवाद! – kuki1384

3

मैं प्रत्येक विधि के लिए एक परीक्षण तैयार करूंगा। यदि आप जटिलता को कम करते हैं तो परीक्षण करना बहुत आसान है।

इन एक परीक्षण प्रत्येक होना चाहिए:

public boolean method1(); 
    public String method2(); 
    public String method3(); 

क्योंकि यह आपके अन्य तरीकों कॉल पिछले विधि का परीक्षण करने की जरूरत नहीं है, कैसे कभी, यदि इस विधि का परिवर्तन (आईएम के बाद से केवल एक नमूना कोड अनुमान लगा) और इसमें अधिक तर्क है तो आपके पास इसके लिए एक टेस्ट विधि भी होनी चाहिए।

यह hasGotExternalDevicesAttached की बात आती है() आप सभी बाहरी कब के लिए ठट्ठा बनाना चाहिए कॉल है कि आप नहीं कर सकते परीक्षण।

आप परीक्षण के भीतर अपने कौशल में सुधार करना चाहते हैं मैं सुझाव है कि आप The Art of Unit Testing पढ़ें। यह मेरी राय में यूनिट परीक्षण की कला सीखने और अध्ययन करने के लिए शुरुआती लोगों के लिए सबसे अच्छी किताब है।

+0

+1: मैं बहुत सहमत हूं! – carlspring

+0

मैं हमेशा बाहरी कॉल का मज़ाक लगाने की कोशिश कर रहा हूं लेकिन मामले में मेरे पास सरल सार्वजनिक विधि है जो कई बूलियन वैरिएबल और वापसी स्थिति की जांच करती है। इस विधि का उपयोग उसी वस्तु में अन्य सार्वजनिक तरीकों से किया जाता है। उपरोक्त पद में इस विधि को ओवरराइड करना मेरे लिए पर्याप्त है। लेकिन मैं आपके उत्तर से भी सहमत हूं। पुस्तक की सिफारिश के लिए धन्यवाद। यह भी सहायक था। – kuki1384

1
हाँ आप कर सकते हैं

, EasyMock Class Extension लाइब्रेरी का उपयोग कर। documentation of EasyMock में "आंशिक मॉकिंग" की तलाश करें।

विचार एक वस्तु के तरीकों में से केवल एक है (या कुछ) नकली, और तरीकों कि मज़ाक उड़ाया विधि पर निर्भर परीक्षण करने के लिए है।

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