gmock:为什么我的测试中没有EXPECT_CALL检测到函数调用?

时间:2014-11-05 21:48:51

标签: c++ googletest gmock

文字"回调叫"从Callback()打印到控制台,但gmock未通过测试说没有发生回调。我做错了什么?

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

1 个答案:

答案 0 :(得分:6)

你的

void Callback();

方法未声明为virtual。所以你不能用一个简单的派生模拟类来嘲​​笑它。

引用google-mock documentation

  

Google Mock可以模拟我们称之为hi-perf依赖注入的非虚函数。

     

在这种情况下,不是与真实类共享公共基类,而是模拟类与真实类无关,但包含具有相同签名的方法。

结果是你必须用模板来实现这一点。从上面链接的文档部分给出了一个简明的例子。


尝试将"" 他们的样本翻译成您的案例,它应该看起来像

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