不,如果不更改源代码或引入您自己的版本,这是不可能的foo()
与可执行代码链接。
From GoogleMock 的常见问题解答 it says
我的代码调用静态/全局函数。我可以嘲笑它吗?
You can, but you need to make some changes.
一般来说,如果您发现自己需要模拟静态函数,则表明您的模块耦合过于紧密(并且灵活性较差、可重用性较差、可测试性较差等)。您最好定义一个小接口并通过该接口调用该函数,然后可以轻松地模拟该函数。一开始需要做一些工作,但通常很快就能收回成本。
这个谷歌测试博客post说得很好。一探究竟。
也来自Cookbook
模拟自由函数
It's possible to use Google Mock to mock a free function (i.e. a C-style function or a static method). You just need to rewrite your code to use an interface (abstract class).
不要直接调用自由函数(例如 OpenFile),而是为其引入一个接口并有一个调用自由函数的具体子类:
class FileInterface {
public:
...
virtual bool Open(const char* path, const char* mode) = 0;
};
class File : public FileInterface {
public:
...
virtual bool Open(const char* path, const char* mode) {
return OpenFile(path, mode);
}
};
您的代码应该与 FileInterface 对话以打开文件。现在可以很容易地模拟这个函数了。
这看起来可能很麻烦,但在实践中,您通常可以将多个相关函数放入同一个接口中,因此每个函数的语法开销会低得多。
如果您担心虚拟函数带来的性能开销,并且分析证实了您的担忧,则可以将其与模拟非虚拟方法的方法结合起来。
正如您在评论中提到的,您实际上提供了自己的版本foo()
,您可以通过另一个模拟类的全局实例轻松解决此问题:
struct IFoo {
virtual A* foo() = 0;
virtual ~IFoo() {}
};
struct FooMock : public IFoo {
FooMock() {}
virtual ~FooMock() {}
MOCK_METHOD0(foo, A*());
};
FooMock fooMock;
// Your foo() implementation
A* foo() {
return fooMock.foo();
}
TEST(...) {
EXPECT_CALL(fooMock,foo())
.Times(1)
.WillOnceReturn(new MockA());
// ...
}
在每个测试用例运行后,不要忘记清除所有调用期望。