MOCK_METHOD
的语法可以在类定义中使用:
class A {
MOCK_METHOD0(f, void(void));
};
是否可以模拟已经声明的方法?我想要的是做类似的事情:
#include "gmock/gmock.h"
class HelloTest {
void f();
};
MOCK_METHOD0(HelloTest::f, void(void));
这个想法是将类定义放在一个hpp文件中,然后将一个mocks放在一个cpp文件中。实际上,我的类定义及其方法的原型需要与我的构建链中的其他cpp文件相同,我不想使用虚函数。
不幸的是,当我尝试执行上面所写的操作时,我在包含MOCK_METHOD0
的行上收到以下错误:
error: ‘gmock0_HelloTest’ has not been declared
这个错误意味着什么,有没有办法做我想做的事?
答案 0 :(得分:1)
首先,您的MOCK_METHOD0()
声明必须属于模拟类under a public
section。例如,您的代码段:
#include "gmock/gmock.h"
class HelloTest {
void f();
};
MOCK_METHOD0(HelloTest::f, void(void));
应该是这样的:
#include "gmock/gmock.h"
class HelloTest {
virtual void f();
};
class Mock_HelloTest : public HelloTest {
public:
MOCK_METHOD0(f, void(void));
};
现在,您会注意到我已将f()
更改为虚拟,因为您在HelloTest::f
中使用MOCK_METHOD0
要求f()
为虚拟。< / p>
由于您不想使用虚拟功能,因此您唯一的另一个选择是使用Google Mock团队调用的hi-perf dependency injection。使用这种非虚拟方法,您必须创建一个不从HelloTest
继承的单独模拟类。您还需要模拟当前使用HelloTest
在生产中HelloTest
和测试中Mock_HelloTest
之间切换的任何代码。
举个例子,假设你有以下函数调用HelloTest::f()
:
void RunHelloTest() {
HelloTest HT;
HT.f();
}
您可以按如下方式设置代码段:
#include "gmock/gmock.h"
class HelloTest {
void f(); // <- f is no longer virtual
};
class Mock_HelloTest { // <- Mock_HelloTest no longer inherits from HelloTest
public:
MOCK_METHOD0(f, void(void));
};
修改RunHelloTest()
以接受模板类型参数:
template <class HelloTestClass>
void RunHelloTest() {
HelloTestClass HT;
HT.f(); // <- will call HelloTest::f() or Mock_HelloTest::f()
}
通过此设置,您可以在生产代码中调用RunHelloTest<HelloTest>()
,在测试代码中调用RunHelloTest<Mock_HelloTest>()
。