文字"回调叫"从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();
}
答案 0 :(得分:6)
你的
void Callback();
方法未声明为virtual
。所以你不能用一个简单的派生模拟类来嘲笑它。
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();
}