使用 GMOCK 模拟在 .cpp 中声明和定义的静态函数,而无需类文件
Mocking static functions declared and defined in .cpp without class file using GMOCK
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
}
相关文章:
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 检查编译时是否存在静态函数
- 名称隐藏对静态函数继承的实例使用
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- 类中静态函数C++意外结果
- 在工人类中使用不同类的静态函数进行实验
- 类 Referention 中C++回调函数引用非静态函数
- 指向模板上下文中的成员函数或静态函数的指针
- 如何检测 Clang AST C++中的静态函数
- 内联asm编译器屏障(内存阻塞器)是算作外部函数,还是算作静态函数调用
- 无法将静态二进制文件链接到 #include
- 如何将 cpp 文件中的静态函数公开给其他文件
- 将函数的引用设置为其他 c++ 文件中的非静态函数
- 使用匿名命名空间中的函数或另一个文件中的静态函数不应该出错吗?
- C++文件范围静态函数
- 使用 GMOCK 模拟在 .cpp 中声明和定义的静态函数,而无需类文件
- 使用文件作用域的c++静态函数
- 在类之外定义静态函数并访问静态值.h和.cc文件
- C++中是否有"static class",例如要在同一文件中访问的静态函数?
- 通过函数指针从外部文件调用静态函数的不良做法