使用mock可以方便地模拟与被测对象想关的对象。
例如以下场景非常适合使用Mock:
- 不同单元之间耦合大,难以测试
- 被测单元依赖的模块还没开发完
- 测试场景复杂,难以真实复现
1. Mock和Stub的区别
Stub是静态桩,不关心何时、何地、以及如何被调用
而对于Mock对象,不同的使用方式会有不同的结果。
类似的测试桩还有double, fake, spy等。
2. Mock的种类
Mock的种类 | Uninteresting函数是否会产生警告 | 产生的警告是否会block测试 |
---|---|---|
NiceMock | 否 | 是 |
StrictMock | 是 | 是 |
NaggyMock | 是 | 否 |
3. Mock的使用流程
- 构建Mock类
- 生成Mock对象
- 设置默认动作和预期
3.1. 构建Mock类
- 定义的Mock类应继承需要模拟的测类
- 针对要模拟的函数使用关键字
MOCK_METHODx
生成Mock函数 - 在实际使用时,x应替换成数字,代表这个函数的参数个数
- 只能Mock类的虚函数
- 对静态函数不友好
class MyClassMock : public MyClass{
public:
MOCK_METHODx(参数名,返回类型(参数类型));
MOCK_CONST_METHODx(参数名,返回类型(参数类型));
};
3.2. 生成Mock对象
创建Mock对象,并把它注入到被测对象中
MyClassMock mock;
ToTestClass obj(mock);
3.3. 设置默认动作和预期
ON_CALL
:期望它做什么EXPECT_CALL
:期望它校验什么
3.3.1. gMock的匹配器
- 可以与
ON_CALL
和EXPECT_CALL
配合使用,也可以以EXPECT_THAT
、ASSERT_THAT
单独使用 - 可以提供通用的匹配功能,也可以针对浮点、字符、容器、指针做匹配
- 用户可以自己定义匹配器
3.3.2. gMock的action
- 可以设置
- 默认行为
- 定义返回值
- 抛异常
- 针对特定参数的特殊行为
3.3.3. gMock的次数生成器
AnyNumber, AtLeast, AtMost, Between, Exactly
3.3.4. gMock期望时序设置
可指定满足期望的次序 形成有时序的期望链条