2013-06-12 65 views
0

我寫了一個嘲笑類的小測試。當我運行它的時候,首先我得到了一個警告:一個無趣的模擬函數被調用,然後測試失敗,因爲沒有滿足期望,那就是至少調用一次模擬函數。有趣的是,當我看到上面的警告消息時,調用該函數。無趣的模擬函數調用bla()&&期望:至少被調用一次bla()?

您對這件事有什麼想法嗎?

謝謝!

編輯:這是我的代碼結構:

class Bla { 

public: 
    Bla(); 
    virtual ~Bla(); 

    virtual float myFunction(); 
} 

class MockBla : public Bla { 
    MockBla(); 
    ~MockBla(); 
    MOCKMETHOD0(myFunction, float()); 
} 

class CallerClass { 

public: 
    CallerClass() { MockBla* myMock = new MockBla(); } 
    virtual ~CallerClass(); 

    myCallingFunction() { myMock->myFunction(); } 
} 

class MyTestClass : public ::testing::Test { 
//.... 
    TEST(myTest, testMyFunction) { 
    MockBla mockBla; 
    EXPECT_CALL(mockBla, myFunction()).Times(AtLeast(1)); 

    CallerClass* callerClass; 
    callerClass = new CallerClass(); 

    callerClass->myCallingFunction(); 

    } 
//.... 
} 

結果:

[ RUN  ] MyTestClass.testMyFunction 

GMOCK WARNING: 
Uninteresting mock function call - returning default value. 
    Function call: myFunction() 
      Returns: 0 
Stack trace: 
MyTestClass.cpp:99: Failure 
Actual function call count doesn't match EXPECT_CALL(mockBla, myFunction())... 
     Expected: to be called at least once 
      Actual: never called - unsatisfied and active 
+0

沒有人,直到你證明你的代碼有什麼想法! –

+0

你說得對,我剛剛用我的代碼示例進行了編輯。謝謝! – emmerich

回答

6

你需要設置你的嘲笑類的實際情況,將在測試的執行過程中被調用的期望。

就你而言,你正在設定對象mockBla的期望值,該值僅在測試結束時被構造並被破壞 - 它從未被使用過。

您將需要將模擬對象傳入CallerClass以供使用,或允許CallerClass將模擬對象創建爲成員變量,但允許測試訪問該實際成員(例如通過獲取器或允許測試成爲CallerClass的朋友)。

傳遞嘲笑對象到調用類會是這樣的一個例子:

#include <memory> 
#include "gmock/gmock.h" 

class Bla { 
public: 
    virtual ~Bla() {} 
    virtual float myFunction() = 0; 
}; 

class MockBla : public Bla { 
public: 
    MOCK_METHOD0(myFunction, float()); 
}; 

class CallerClass { 
public: 
    explicit CallerClass(Bla* bla) : mBla(bla) {} 
    void myCallingFunction() { mBla->myFunction(); } 
private: 
    Bla* mBla; 
}; 

TEST(myTest, testMyFunction) { 
    std::shared_ptr<Bla> mockBla(new MockBla); 
    EXPECT_CALL(*std::static_pointer_cast<MockBla>(mockBla), 
       myFunction()).Times(testing::AtLeast(1)); 

    CallerClass callerClass(mockBla.get()); 
    callerClass.myCallingFunction(); 
} 

int main(int argc, char** argv) { 
    testing::InitGoogleTest(&argc, argv); 
    return RUN_ALL_TESTS(); 
} 
+0

非常感謝!就是這樣,它現在起作用!我現在可以用我的CPPUNIT使用GMock。 :) – emmerich

+0

好東西。很高興它的作品。 – Fraser

相關問題