2015-10-26 10 views
8

Mockito में हम (here से लिया गया) जैसे कई रिटर्न निर्दिष्ट कर सकते हैं:gmock में लगातार रिटर्न निर्दिष्ट करने के लिए कैसे?

//you can set different behavior for consecutive method calls. 
//Last stubbing (e.g: thenReturn("foo")) determines the behavior of further consecutive calls. 
when(mock.someMethod("some arg")) 
    .thenReturn(new RuntimeException()) 
    .thenReturn("foo"); 

//There is a shorter way of consecutive stubbing: 
when(mock.someMethod()).thenReturn(1,2,3); 
when(mock.otherMethod()).thenThrow(exc1, exc2); 

वहाँ gmock के साथ किए गए एक नकली के लिए कई रिटर्न निर्दिष्ट करने के लिए कोई तरीका है? वर्तमान में मेरे पास है:

store_mock_ = std::make_shared<StorageMock>(); 
ON_CALL(*store_mock_, getFileName(_)).Return("file1").Return("file2"); 

जो संकलित नहीं करता है क्योंकि मैं gmock में एकाधिक रिटर्न नहीं समझ सकता। क्या यह gmock के साथ संभव है? यदि नहीं, तो क्या इस समस्या को हल करने का कोई और तरीका है? मैंने पाया है कि हम EXPECT कई वापसी मान की तरह कर सकते हैं:

using ::testing::Return;... 
EXPECT_CALL(turtle, GetX()) 
    .WillOnce(Return(100)) 
    .WillOnce(Return(200)) 
    .WillOnce(Return(300)); 

हालांकि, मैं नहीं कोई भी दस्तावेज़ ON_CALL के साथ कई रिटर्न मजाक के लिए मिल गया है।

उत्तर

9

ON_CALL फ़ंक्शन के डिफ़ॉल्ट व्यवहार को सेट करने के लिए अधिक उपयोग किया जाता है। अर्थात। आप जानते हैं कि परीक्षण कोड में मॉक किए गए फ़ंक्शन को कॉल किया जाता है, आप कुछ डिफ़ॉल्ट मान सेट करना चाहते हैं, लेकिन यह वास्तव में महत्वपूर्ण नहीं है कि फ़ंक्शन को कितनी बार बुलाया जाता है।

example: मैं expectations प्रयोग करेंगे

ON_CALL(foo, Sign(_)) 
     .WillByDefault(Return(-1)); 
    ON_CALL(foo, Sign(0)) 
     .WillByDefault(Return(0)); 
    ON_CALL(foo, Sign(Gt(0))) 
     .WillByDefault(Return(1)); 

अपने वांछित व्यवहार प्राप्त करने के लिए - आप पहले से ही सवाल में मौजूद कुछ उदाहरण प्रदान की है, सिर्फ कुछ दिखाने के लिए - एक उदाहरण है जब आप 1 उम्मीद, 2 तो हमेशा 3: जब आप परीक्षण स्थिरता SetUp में इस सेट करना चाहते हैं

EXPECT_CALL(foo, Sign(_)) 
     .WillOnce(Return(1)) 
     .WillOnce(Return(2)) 
     .WillRepeatedly(Return(3)); 

EXPECT_CALL "रास्ता" परेशानी हो सकती है - और कुछ परीक्षण मीटर केवल एक बार foo कॉल करें। लेकिन, ज़ाहिर है, वहाँ तरीके के लिए "नियंत्रण" आगामी कॉल के लिए ON_CALL वापसी मान रहे हैं - लेकिन आप विशेष कार्यों के साथ यह करना चाहिए - कुछ फ़ंक्शन के परिणाम हो रही है की तरह - इस उदाहरण में की तरह:

class IDummy 
{ 
public: 
    virtual int foo() = 0; 
}; 

class DummyMock : public IDummy 
{ 
public: 
    MOCK_METHOD0(foo, int()); 
}; 
using namespace ::testing; 
class DummyTestSuite : public Test 
{ 
protected: 
    DummyMock dummy; 
    void SetUp() override 
    { 
     ON_CALL(dummy, foo()) 
      .WillByDefault(
       InvokeWithoutArgs(this, &DummyTestSuite::IncrementDummy)); 
    } 
    int dummyValue = 0; 
    int IncrementDummy() 
    { 
     return ++dummyValue; 
    } 

}; 


TEST_F(DummyTestSuite, aaa) 
{ 
    ASSERT_EQ(1, dummy.foo()); 
    ASSERT_EQ(2, dummy.foo()); 
    ASSERT_EQ(3, dummy.foo()); 

} 
+1

मेरे उम्मीदों की समझ यह है कि वे वही हैं जिन्हें हम वापस आने की उम्मीद करते हैं, न कि वास्तव में नकली द्वारा क्या किया जाना चाहिए। क्या यह गलत है? आपका 'वृद्धि डमी' उदाहरण वास्तव में सहायक है। किंडा बेकार है कि कई रिटर्न परिभाषित करने का सबसे अच्छा तरीका इतना शामिल है। :( –

+2

यदि मैं आपको सही ढंग से समझता हूं - तो हाँ। मेरा उदाहरण बहुत कृत्रिम है - हम कभी भी दावा नहीं करते कि कौन से नकल लौटते हैं - मैं यह परीक्षण यह दिखाने के लिए लिखता हूं कि यह तंत्र काम करता है। अधिक सामान्य हम कह सकते हैं कि 'EXPECT_CALL' ऐसे मामलों में जब हम उम्मीद करते हैं कि मॉक किए गए फ़ंक्शन को परीक्षण कोड के भीतर से बुलाया जाता है। "वापसी मूल्य" सेट करना आवश्यक नहीं है - उदाहरण के लिए यह अक्सर होता है कि हम शून्य कार्य को कॉल करने की अपेक्षा करते हैं .... – PiotrNycz

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