file.h
int func(int);
file.cpp
static int call();
static void print(int x);
int func(int) {
int val = call();
print(val);
}
此处静态函数在同一文件 file.cpp 中声明和定义。我这里没有包含静态函数的定义。 现在使用 GMock 我需要模拟或测试.h和.cpp中定义的所有函数。
答案 0 :(得分:4)
我能给出的唯一答案是来自GMocks FAQ的答案:
我的代码调用静态/全局函数。我可以嘲笑它吗?
你可以,但你需要做一些改变。
通常,如果您发现自己需要模拟静态函数,则表明您的模块耦合得太紧(并且灵活性较低,可重用性较低,可测试性较差等)。你可能最好定义一个小接口并通过该接口调用该函数,然后可以很容易地模拟它。这最初是一项工作,但通常会很快收回成本。
此Google测试博客post说得非常好。看看这个。
答案 1 :(得分:1)
由于这两个函数是隐藏的,因此您无法测试它们,除了调用func
函数之外。
这意味着,你无法模拟对'call'和'print'函数的调用。
唯一的方法是以某种方式取消隐藏这两个功能,或者至少改变你调用它们的方式。
如果在标题中创建函数回调变量,并调用它们而不是实际函数,则可以模拟这些调用。这样的事情(未经测试):
file.h
typedef void call();
namespace hidden{
extern call callCb;
}
int func(int);
file.cpp
namespace{
void call(){
//do stuff
}
}
namespace hidden{
call callCb=::call;
}
int func(int){
hidden::callCb();
// do things
}