C++ 单元测试是否调用函数对象

C++ 单元测试是否调用函数对象,c++,unit-testing,googletest,C++,Unit Testing,Googletest,mock用于检测函数调用。如果我们有一个带有函数对象的类,可以做什么: #include <functional> #include <iostream> using namespace std; class A { public: A(){}; void doit(){ //... if(f) f(); //...

mock用于检测函数调用。如果我们有一个带有函数对象的类,可以做什么:

#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();
}
#包括
#包括
使用名称空间std;
甲级{
公众:
A(){};
void doit(){
//...
如果(f)
f();
//...
}
函数f;
};
int main(){
A A;

a、 f=[](){cout几天前我就需要这个。我最后做的是这样的:

class TestHelper
{
public:
  MOCK_METHOD0(foo, void());
};
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();
}
然后,当我实例化我的对象时,我传递一个模拟函数或一个更精确地使用该函数的lambda(您也可以使用std::bind)

注意:您还需要声明要测试该函数调用。为此,您有
EXPECT\u call

在您的示例中,它将如下所示:

class TestHelper
{
public:
  MOCK_METHOD0(foo, void());
};
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();
}
请注意,要做到这一点,您将需要google mock


您可以添加一个变量,该变量在被调用时会发生更改。然后检查它是否具有更改的值。使用Mock,您可以使用FMock=testing::MockFunction;
而不是
TestHelper
;参见