使用GMOCK模拟在.cpp中声明和定义的静态函数,而不使用类文件

时间:2013-07-29 06:11:14

标签: c++ static-methods googletest gmock non-member-functions

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中定义的所有函数。

2 个答案:

答案 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
}