2014-11-05 87 views
2

Callback()調用的回調函數打印到控制檯,但gmock未通過測試,表示沒有發生回調。我究竟做錯了什麼?gmock:爲什麼EXPECT_CALL在我的測試中檢測不到函數調用?

class MyClass 
{ 
    public: 
     MyClass() { }; 
     virtual ~MyClass() { }; 
     void Callback() { printf("callback called\n"); }; 
}; 

class MyClassMock : public MyClass 
{ 
public: 
    MOCK_METHOD0(Callback, void()); 
}; 

class Caller 
{ 
public: 
    Caller(MyClass *myClass) { m_myClass = *myClass; }; 
    void Call() { m_myClass.Callback(); }; 
private: 
    MyClass m_myClass; 
}; 

TEST(BasicTest, Positive) 
{ 
    MyClassMock mock; 
    EXPECT_CALL(mock, Callback()).Times(1); 

    Caller caller(&mock); 
    caller.Call(); 
} 
+0

有什麼gmock錯誤/警告的準確輸出?請參閱[這裏](https://code.google.com/p/googlemock/wiki/CookBook#Mocking_Nonvirtual_Methods)如何模擬非虛擬方法。 – 2014-11-05 22:03:05

+0

錯誤只是表示它期望1次調用而沒有實際的調用。我讀了你提供給非虛函數的鏈接,但是我不清楚我將如何適應我的代碼... – user3338893 2014-11-05 22:15:09

回答

6

void Callback(); 

方法未聲明virtual。所以你不能用簡單派生的模擬類來嘲​​笑它。

要從google-mock documentation

谷歌模擬舉可以嘲笑我們稱之爲高新PERF的依賴注入中使用非虛函數。

在這種情況下,您的mock類將與真實類無關,但包含具有相同簽名的方法,而不是與真實類共享一個基類。

結果是你必須用模板來實現這一點。在上面鏈接的文檔部分給出了一個簡明的例子。


試圖「翻譯」他們的樣品到你的情況下,它應該看起來像

class MyClass { 
    public: 
     MyClass() { }; 
     virtual ~MyClass() { }; 
     void Callback() { printf("callback called\n"); }; 
}; 

class MyClassMock { 
public: 
    MOCK_METHOD0(Callback, void()); 
}; 

template<class T> 
class Caller { 
public: 
    Caller(T& myClass) : m_myClass(myClass) {} 
    void Call() { m_myClass.Callback(); } 
private: 
    T& m_myClass; 
}; 

TEST(BasicTest, Positive) { 
    MyClassMock mock; 
    EXPECT_CALL(mock, Callback()).Times(1); 

    Caller<MyClassMock> caller(mock); 
    caller.Call(); 
} 
+0

非常感謝! – user3338893 2014-11-05 22:41:13

相關問題