2016-10-04 59 views
1

模擬函數用於檢測函數調用。有什麼可以做,如果我們有一個函數對象類:單元測試函數對象是否被調用

#include <functional> 
#include <iostream> 

using namespace std; 

class A { 
    public: 
     A(){}; 
     void doit(){ 
      //... 
      if(f) 
       f(); 
      //... 
     } 
     function<void()> f; 
}; 

int main(){ 
    A a; 
    a.f = []() { cout << "hello\n"; }; 
    a.doit(); 
} 

有沒有一種方法來測試wheter f在功能doit()叫?

+1

你可以添加一個變量,當它被調用時會發生變化。然後檢查它是否有改變的值。 – Hayt

+1

隨着模擬,你有'EXPECT_CALL' – Jarod42

回答

1

我前幾天需要。我落得這樣做是這樣的:

class TestHelper 
{ 
public: 
    MOCK_METHOD0(foo, void()); 
}; 

而且比,當我實例化我的對象,我通過使用該功能,以更準確(你也可以使用std嘲笑的功能或拉姆達::綁定)。

注意:您還需要聲明您要測試該函數調用。爲此,你有EXPECT_CALL

在您的例子就應該是這樣的:

TEST(My_test) 
{ 
    A a; 
    TestUtil helper; 
    EXPECT_CALL(helper, foo()).Times(1); // Or whatever other matcher and action you want to test. 
    a.f = []() { helper.foo(); }; 
    a.doit(); 
} 

請注意,您將需要谷歌,模仿這樣做。

+0

只是'使用FMock = testing :: MockFunction ;'而不是'TestHelper';請參閱https://github.com/google/googletest/blob/master/googlemock/docs/CheatSheet.md#mock-classes – PiotrNycz

相關問題