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

Mocking static functions declared and defined in .cpp without class file using GMOCK

本文关键字:静态函数 文件 定义 模拟 GMOCK cpp 声明 使用      更新时间:2023-10-16
file.h
int func(int);
file.cpp
static int call();
static void print(int x);
int func(int) {
    int val = call();
    print(val);
}

这里静态函数在同一个文件文件中声明和定义.cpp。我在这里没有包括静态函数的定义。现在使用 GMock,我需要模拟或测试在 .h 和 .cpp 中定义的所有函数。

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

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

您可以,但需要进行一些更改。

一般来说,如果你发现自己需要模拟一个静态函数,这表明你的模块耦合得太紧密(灵活性更低,可重用性更低,可测试性更低等(。你最好定义一个小接口,并通过该接口调用该函数,这样就可以很容易地被模拟。最初是一些工作,但通常会很快收回成本。

这篇谷歌测试博客文章说得很好。看看吧。

由于这两个函数是隐藏的,因此除了调用func函数之外,您无法测试它们。

这意味着,您不能模拟对"调用"和"打印"函数的调用。

唯一的方法是以某种方式取消隐藏这两个函数,或者至少更改调用它们的方式。

如果您在标头中创建函数回调变量,并调用它们而不是真正的函数,则可以模拟这些调用。像这样的东西(未经测试(:

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
}