2010-01-21 19 views
6

मैं जुनीट डब्ल्यू/ईज़ीमोक में एक परीक्षण स्थापित करने की कोशिश कर रहा हूं और मैं एक छोटे से मुद्दे में भाग रहा हूं कि मैं अपने सिर को चारों ओर लपेट नहीं सकता। मैं उम्मीद कर रहा था कि यहां कोई मदद कर सकता है।जुनीट Easymock अप्रत्याशित विधि कॉल

यहाँ विधि मैं परीक्षण करने के लिए कोशिश कर रहा हूँ का एक सरलीकृत संस्करण है:

public void myMethod() { 
    //(...) 
    Obj myObj = this.service.getObj(param); 
    if (myObj.getExtId() != null) { 
     OtherObj otherObj = new OtherObj(); 
     otherObj.setId(myObj.getExtId()); 
     this.dao.insert(otherObj); 
    } 
    //(...) 
} 

ठीक है तो EasyMock का उपयोग कर रहा service.getObj(myObj) कॉल मज़ाक उड़ाया गया है और कहा कि ठीक काम करता है।

मेरी समस्या तब होती है जब जुनीट dao.insert(otherObj पर कॉल करता है) कॉल करें। EasyMock उस पर *Unexpected Method Call* फेंकता है।

मैं अपने परीक्षण में कि दाव मजाक और उस पर expectLastCall().once(); का उपयोग कर कोई फ़र्क नहीं पड़ेगा, लेकिन यह मान लिया गया है मैं "otherObj" कि डालने समय में एक पैरामीटर के रूप में पारित कर दिया है पर एक संभाल कि ... पाठ्यक्रम मैं में से कौन सा ऐसा नहीं है क्योंकि यह सशर्त रूप से परीक्षण की जा रही विधि के संदर्भ में बनाया गया है।

किसी को भी कभी इसका सामना करना पड़ा है और किसी भी तरह से इसे हल किया है?

धन्यवाद।

उत्तर

9

यदि आप अपने परीक्षण कोड में ऑब्जेक्ट का संदर्भ नहीं ले सकते हैं, तो आप EasyMock.anyObject() का उपयोग अपने insert विधि पर अपेक्षित तर्क के रूप में कर सकते हैं। जैसा कि नाम से पता चलता है, यह विधि के साथ कॉल करने की उम्मीद करेगा .. अच्छी तरह से, कोई ऑब्जेक्ट :)

यह सही तर्क से मेल खाने से थोड़ा कम कठोर हो सकता है, लेकिन यदि आप इससे खुश हैं, तो इसे दें स्पिन। अपेक्षित विधि कॉल घोषित करते समय OtherObj पर कास्ट शामिल करना याद रखें।

+0

हाँ है कि चाल धन्यवाद DoctorRuss किया था। :) – Lancelot

12

आप थोड़ी अधिक प्रकार की सुरक्षा के लिए EasyMock.isA(OtherObj.class) का भी उपयोग कर सकते हैं।

5

कोई भी ऑब्जेक्ट() मैचर बहुत अच्छा काम करता है अगर आप सिर्फ इस कॉल को प्राप्त करना चाहते हैं, लेकिन यदि आप वास्तव में निर्मित ऑब्जेक्ट को सत्यापित करना चाहते हैं तो क्या आपने सोचा था कि यह होने वाला है, आप कैप्चर का उपयोग कर सकते हैं।

Capture<OtherObj> capturedOtherObj = new Capture<OtherObj>(); 
mockDao.insert(capture(capturedOtherObj)); 
replay(mockDao); 

objUnderTest.myMethod(); 

assertThat("captured what you expected", capturedOtherObj.getValue().getId(), 
      equalTo(expectedId)); 

इसके अलावा, PowerMock उम्मीद करने के लिए एक वस्तु, का निर्माण किया है, ताकि आप उस में यदि आप चाहते थे दिखाई दे सकता है की क्षमता है: यह कुछ ऐसा दिखाई देगा।

1

ध्यान दें कि यदि आप EasyMock.createStrictMock(); का उपयोग करते हैं, तो विधि कॉल का क्रम भी महत्वपूर्ण है और यदि आप इस नियम को तोड़ते हैं, तो यह एक अप्रत्याशित विधि कॉल फेंक देगा।

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