googletest - 使用 gmock 编写单元测试
问题描述
考虑如下情况
class A
{
public:
bool Init()
{
bool ret = false;
/* code */
return ret;
}
};
A a_obj;
class B
{
public:
bool Foo()
{
if(a_obj.Init())
{
cout<< "X" ;
}
else
{
cout<< "Y" ;
}
}
}
class MockA
{
public:
METHOD0(Init, bool());
};
TEST(InitTest, CallFoo)
{
MockA mockobj;
B b_obj;
/* ???*/
}
我想写2个单元测试用例,用mock模拟Init的返回值
- Init 的返回值为真,打印 X
- Init 的返回值为 false,打印 Y。
我不想将 A 对象保留为 B 的成员,我想将其保留为全局变量。我该如何编写这些测试?
解决方案
A
不必是成员B
- 它可以作为参数传递给 Foo()
witha_obj
作为默认值:
// A definition as before
A a_obj;
class B
{
public:
bool Foo(A& a = a_obj)
{
if(a.Init())
{
cout<< "X" ;
}
else
{
cout<< "Y" ;
}
}
}
但是您必须创建Init
一个虚拟方法(并且很可能将虚拟 dtor 添加到 A),然后MockA
派生自A
或使用高性能DI,并根据模板创建Foo
一个模板方法或整个类B
。
推荐阅读
- reactjs - React native 不会重新渲染所有新状态
- android - 后台服务在android R中以省电模式停止
- swift - Swift - 自定义解码器没有 decode() 功能
- python - 无法在同一目录 Visual Studio Code 中找到/导入 .py 文件
- java - Java - 如何将数组 char[] 中的相同字符转换为星号 '*',前提是字符旁边是相同的
- r - Using variable value from one Shiny module in another module
- android-ndk - 我在 Android-ndk 上收到 posix_spawnp 函数的编译错误
- firebase - Deleting a folder from Firebase Cloud Storage in Flutter
- javascript - 如何在使用网络摄像头输入进行面部识别(opencv4nodejs)时在服务器(javascript)上记录和下载/上传网络摄像头流?
- python - 如何在numpy中获得许多滚动窗口切片?