使用mock可以方便地模拟与被测对象想关的对象。
例如以下场景非常适合使用Mock:

  1. 不同单元之间耦合大,难以测试
  2. 被测单元依赖的模块还没开发完
  3. 测试场景复杂,难以真实复现

1. Mock和Stub的区别

Stub是静态桩,不关心何时、何地、以及如何被调用
而对于Mock对象,不同的使用方式会有不同的结果。
类似的测试桩还有double, fake, spy等。

2. Mock的种类

Mock的种类 Uninteresting函数是否会产生警告 产生的警告是否会block测试
NiceMock
StrictMock
NaggyMock

3. Mock的使用流程

  1. 构建Mock类
  2. 生成Mock对象
  3. 设置默认动作和预期

3.1. 构建Mock类

  1. 定义的Mock类应继承需要模拟的测类
  2. 针对要模拟的函数使用关键字MOCK_METHODx生成Mock函数
  3. 在实际使用时,x应替换成数字,代表这个函数的参数个数
  4. 只能Mock类的虚函数
  5. 对静态函数不友好
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的匹配器

  1. 可以与ON_CALLEXPECT_CALL配合使用,也可以以EXPECT_THATASSERT_THAT单独使用
  2. 可以提供通用的匹配功能,也可以针对浮点、字符、容器、指针做匹配
  3. 用户可以自己定义匹配器

3.3.2. gMock的action

  1. 可以设置
  2. 默认行为
  3. 定义返回值
  4. 抛异常
  5. 针对特定参数的特殊行为

3.3.3. gMock的次数生成器

AnyNumber, AtLeast, AtMost, Between, Exactly

3.3.4. gMock期望时序设置

可指定满足期望的次序 形成有时序的期望链条

results matching ""

    No results matching ""