2012-12-18 13 views
30

मुझे पर इसका उपयोग करते समय ON_CALL और EXPECT_CALL के बीच का अंतर समझ में नहीं आता है।gmock सेटिंग डिफ़ॉल्ट क्रियाएं/ON_CALL बनाम EXPECT_CALL

अब तक मैंने देखा है/सीखा वहाँ एक नकली के डिफ़ॉल्ट कार्रवाई को समायोजित करने के दो तरीके हैं:

ON_CALL(mock, methodX(_)).WillByDefault(Return(0x01)); 

या

EXPECT_CALL(mock, methodX(_)).WillRepeatedly(Return(0x01)); 

किसी ने मुझे समझा सकते हैं:

  • दो विधियों के बीच अंतर
  • अप और डाउन हर एक
  • की जब यह उचित उन्हें इस्तेमाल करने के लिए है (सेटअप किस तरह ...)

उत्तर

29

दो बयानों के बीच सूक्ष्म लेकिन महत्वपूर्ण मतभेद रहे हैं। EXPECT_CALL एक नकली कॉल पर उम्मीद सेट करता है।

EXPECT_CALL(mock, methodX(_)).WillRepeatedly(do_action); 

लेखन gMock बताता है कि methodXmock पर किसी भी तर्क के साथ कितनी भी बार बुलाया जा सकता है, और जब यह है, mockdo_action प्रदर्शन करेंगे। दूसरी ओर,

ON_CALL(mock, methodX(_)).WillByDefault(do_action); 

gMock बताता है कि जब भी methodXmock पर शुरू हो जाती है, यह do_action प्रदर्शन करना चाहिए। यह सुविधा एक परिदृश्य में सहायक है जहां आपको अपने नकली पर कई उम्मीदें लिखनी होंगी, और उनमें से अधिकांश को एक ही कार्रवाई निर्दिष्ट करनी होगी - खासकर यदि यह जटिल है। आप ON_CALL में उस क्रिया को निर्दिष्ट कर सकते हैं, और उसके बाद कार्रवाई को स्पष्ट किए बिना EXPECT_CALL लिख सकते हैं। जैसे,

ON_CALL(mock, Sign(Eq(0), _)) 
    .WillByDefault(DoAll(SetArgPointee<1>("argument is zero"), Return(0))); 
ON_CALL(mock, Sign(Gt(0), _)) 
    .WillByDefault(DoAll(SetArgPointee<1>("argument is positive"), Return(1))); 
ON_CALL(mock, Sign(Lt(0), _)) 
    .WillByDefault(DoAll(SetArgPointee<1>("argument is negative"), Return(-1))); 

अब, अगर आप EXPECT_CALL रों का एक बहुत लिखने के लिए है, तो आप mock की जरूरत नहीं है के व्यवहार हर बार निर्दिष्ट करें:

EXPECT_CALL(mock, Sign(-4, _)); 
EXPECT_CALL(mock, Sign(0, _)); 
EXPECT_CALL(mock, Sign(1, _)).Times(2); 
EXPECT_CALL(mock, Sign(2, _)); 
EXPECT_CALL(mock, Sign(3, _)); 
EXPECT_CALL(mock, Sign(5, _)); 

अन्य उदाहरण में, साइन रिटर्न संभालने int, यदि आप लिखना

ON_CALL(mock, Sign(Gt(0), _)).WillByDefault(Return(1)); 
EXPECT_CALL(mock, Sign(10, _)); 

कॉल mock.Sign(10) वापस आ जाएगी 1 ON_CALL के रूप में एक के लिए डिफ़ॉल्ट व्यवहार प्रदान करता है कॉल EXPECT_CALL द्वारा निर्दिष्ट है। लेकिन अगर आप लिखना

EXPECT_CALL(mock, Sign(Gt(0), _).WillRepeatedly(Return(1)); 
EXPECT_CALL(mock, Sign(10, _)); 

mock.Sign(10, p) के आह्वान 0. वापस आ जाएगी यह दूसरी उम्मीद के खिलाफ मिलान किया जाएगा। यह उम्मीद कोई स्पष्ट कार्रवाई निर्दिष्ट नहीं करती है और gMock इसके लिए एक डिफ़ॉल्ट कार्रवाई उत्पन्न करेगा। वह डिफ़ॉल्ट कार्रवाई रिटर्न प्रकार का डिफ़ॉल्ट मान वापस करना है, जो int के लिए 0 है। इस मामले में पहली उम्मीद पूरी तरह नजरअंदाज कर दी जाएगी।

7
ON_CALL(mock, methodX(_)).WillByDefault(Return(0x01)); 
EXPECT_CALL(mock, methodX(_)).WillRepeatedly(Return(0x01)); 

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

हालांकि, वहाँ एक तार्किक अंतर है:

  • ON_CALL(mock, methodX(_)).WillByDefault(Return(0x01)); मतलब है कि प्रणाली कहा जा सकता है, और अगर ऐसा होता, हर कॉल 0x01
  • EXPECT_CALL(mock, methodX(_)).WillRepeatedly(Return(0x01)); वापस आ जाएगी मतलब है कि यह उम्मीद है कि विधि होगा कहा जा, और हर कॉल वापस आ जाएगी 0x01

वैसे, वहाँ उनकी ch में एक Setting default actions है चादर, जो कहते हैं खाने:

एक विशेष विधि की डिफ़ॉल्ट गतिविधि को अनुकूलित करने के लिए, ON_CALL() का उपयोग करें:

ON_CALL(mock_object, method(matchers)) 
    .With(multi_argument_matcher) ? 
    .WillByDefault(action); 
+0

लेकिन ऐसा लगता है कि जब मैं एक OPPALL के साथ पहले EXPECT_CALL के साथ परिभाषित डिफ़ॉल्ट क्रिया को ओवरराइड करने का प्रयास करता हूं तो यह काम नहीं करता है। कोई उपाय? – Nicoretti

+2

@ निकोरेटी नहीं, यह काम नहीं करता है। मुझे यह भी यकीन नहीं है कि यदि आप दोनों सेट करते हैं तो क्या होगा। शायद उस मामले में केवल एक ही निष्पादित हो जाता है। बीटीडब्ल्यू gtest में एक [सेक्शन] (http://code.google.com/p/googlemock/wiki/CheatSheet#Setting_Default_Actions) है जो एक डिफ़ॉल्ट व्यवहार को सेट करने का तरीका बताता है। –

+0

हाँ ने इसे देखा लेकिन मैं इस तथ्य के कारण उत्सुक और उलझन में था कि EXPECT_CALL का उपयोग डिफ़ॉल्ट व्यवहार को संशोधित करने के लिए किया जा सकता है। और दस्तावेज़ दोनों पक्षों का उपयोग करते समय दुष्प्रभाव/प्राथमिकता के बारे में कुछ भी नहीं कहते हैं। – Nicoretti

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