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

时间:2016-10-04 10:27:43

标签: c++ unit-testing googletest

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

#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();
}

有没有办法在函数f中调用doit()进行测试?

1 个答案:

答案 0 :(得分:1)

几天前我只需要那个。我最终做的是这样的事情:

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

而且,当我实例化我的对象时,我传递模拟函数或使用该函数的lambda更精确(你也可以使用std :: bind)。

注意:您还需要声明要测试该函数调用。为此你有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();
}
  

请注意,您需要google-mock才能执行此操作。