Mock简介
mock 工具的作用是指定函数的行为(模拟函数的行为)。可以对入参进行校验,对出参进行设定,还可 以指定函数的返回值。
几个相关概念:
(1)mock 规范:每个 MOCKER(function)开始,跟一系列的.stubs、.with、.will 等的内容的整体,称 为一个 mock 规范。
(2)核心关键字:指 stubs/defaults/expects/before/with/after/will/then/id 等这些直接跟在点后面 的关键字。
(3)扩展关键字:指 once()/eq()/check()/returnValue()/repeat()等这些作为核心关键字参数的关键字。
匹配关键字:expects的参数
约束关键字:with的参数
桩关键字:will/then的参数
Mock打桩
3个用于打桩的宏:
- MOCKER:对全局函数(C函数)打桩
MOCKER(函数名) - MOCKER_CPP:对类的普通函数打桩
MOCKER_CPP(&类名::函数名) - MOCKER_CPP_VIRTUAL:对类的虚函数打桩
MOCKER_CPP_VIRTUAL(类对象指针,&类名::函数名)
2个核心关键字:
stubs() :指定某个函数的行为,单纯表示打桩
will():和桩关键字一起用,指定被调函数的行为
2个桩关键字:
returnValue(一个值): 对返回值打桩,即data桩
注意:mock是强类型的,不支持默认类型转换,类型不一致的话,需要手动强制类型转换
invoke(一个函数名):对函数本身打桩,即user桩
更多的核心关键字:
-
defaults:设定函数的默认行为,会被stubs、expects等覆盖掉
-
then: 和will用法一样,第一次用will,后面更多次用then,如果调用次数超过了设置的次数,则后面的以最后一次为准
-
id、before、after:用于指定多个规范之间的顺序
-
expects: 和匹配关键字一起用,校验次数
-
with: 和约束关键字一起用,校验参数
-
repeat(值,次数):重复返回一个值多少次
-
returnObjectList(值1,值2,值3,…):依次返回这些值
-
increase(初始值,结束值):返回值每次加1,结束值可以没有
注意:这仨关键字对次数有严格限制,如果调用次数多了,用例会挂掉,少了没关系
匹配关键字:和expects一起校验次数的
约束关键字:和with一起校验参数
-
入参校验:
-
设置出参:
卸桩
GlobalMockObject::verify():校验并清除所有MOCKER规范,即卸桩,直接写在TearDown里即可
优缺点
优点
1,调用起来更加简洁,尤其是针对虚函数的打桩,使用极其方便
2,对于打的多个桩,只需要一行就可以全部清除
缺点
1,没法对变长参数的函数打桩,如日志函数,就无法打桩
2,无法单独清除某一个桩,有时候不是很方便。如果非要实现单独清除某个桩,MOCK_METHOD勉强可以做到(PPT里未涉及到),但这个也是以对象为维度的,而不是针对某个桩