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

4

2 回答 2

4

我能给出的唯一答案是来自GMocks FAQ的答案:

我的代码调用一个静态/全局函数。我可以嘲笑它吗?

你可以,但你需要做一些改变。

一般来说,如果您发现自己需要模拟一个静态函数,这表明您的模块耦合太紧密(并且灵活性较差、可重用性较差、可测试性较差等)。您最好定义一个小接口并通过该接口调用该函数,然后可以轻松地对其进行模拟。最初需要做一些工作,但通常会很快收回成本。

这篇 Google 测试博客文章说得非常好。一探究竟。

于 2013-07-29T06:47:51.710 回答
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
}
于 2013-07-29T07:57:01.603 回答