0 引言
- mock:模拟,用于验证外部依赖的交互行为,通常用于未实现的依赖
- stub:存根,用于提供外部依赖的固定响应,通常用于已实现的依赖
- GTest:GTest即Google Test,其是一个由 Google 开发的跨平台测试框架,主要用于编写 C++ 程序的单元测试。GTest 帮助开发者编写可靠的代码,通过自动化测试来验证代码的正确性,其有关要点请直接参阅 GoogleTest Primer | GoogleTest!
博主搭建的单元测试框架最常用的搭配就是GTest+mockcpp,主要用于针对C语言的项目做单元测试。
1 mockcpp简介
mockcpp工具是一个打桩工具,用于指定函数的行为。其可以对入参进行校验,对出参进行设定,指定函数的返回值。
其支持七种类型的约束:
- 调用次数约束 —— expects()/stubs()
- 调用者约束 —— caller()
- 先行调用约束 —— before()
- 调用参数约束 —— with()
- 后行调用约束 —— after()
- 调用行为约束 —— will()/then()
- 标识符指定 —— id()
2 mock模板
TEST(mockcppDetailSample) { MOCKER(function) / MOCK_METHOD(mocker, method) .stubs() / defaults() / expects(never() | once() | exactly(3) | atLeast(3) | atMost(3) ) [.before("some-mocker-id")] [.with( any() | eq(3) | neq(3) | gt(3) | lt(3) | spy(var_out) | check(check_func) | outBound(var_out) | outBoundP(var_out_addr, var_size) | mirror(var_in_addr, var_size) | smirror(string) | contains(string) | startWith(string) | endWith(string) )] [.after("some-mocker-id")] .will( returnValue(1) | repeat(1, 20) | returnObjectList(r1, r2) | invoke(func_stub) | ignoreReturnValue() | increase(from, to) | increase(from) | throws(exception) | die(3)) [.then(returnValue(2))] [.id("some-mocker-id")] }
3 mock规范
每个MOCKER(function)开始,跟着一系列的.stubs/.with/.will
等的内容整体,称为一个mock规范。
除调用次数约束之外,所有其它的调用约束都可以任意存在。但若使用了其中的一部分或全部,则必须按照上面所列的顺序给出。
4 核心关键字
指stubs/defaults/expects/before/with/after/will/then/id
等这些直接跟在点"."
后面的关键字
5 扩展关键字
指once()/eq()/check()/returnValue()/repeat()
等这些作为核心关键字参数的关键字