如何在gmock中禁用Naggy mock并兼顾CI管控与调试需求?
关于gmock禁用Naggy Mock的实现方案
gmock包含三种Mock类型,相关核心规则与概念如下:
核心概念概述
- 无意义调用(uninteresting call):调用了从未指定过执行逻辑的函数
- 意外调用(unexpected call):调用的函数有预设预期行为,但实际调用未匹配到任何预期
所有Mock都会将意外调用视为错误,它们的核心区别在于处理无意义调用的方式:
- 默认的Naggy mock:打印警告信息并返回默认值
- Nice mock:直接返回默认值,不输出警告
- Strict mock:直接触发测试失败
默认值默认是通过默认构造生成的对象(可通过gmock的DefaultValue机制重写),如果无法构造默认对象且未重写默认值逻辑,测试会直接失败。
简言之,Naggy mock在项目中属于两头不讨好的选择:它保留了默认行为,但会打印不必要的警告,而我们不希望测试输出中出现这类警告。
gmock官方建议:"多数场景使用Nice mock(目前未设为默认),开发或调试测试时使用Naggy mock(当前默认),仅在万不得已时使用Strict mock。"
我希望在项目中禁用Naggy mock,有没有简洁的实现方式?要求既能在CI流程中轻松管控,又不限制开发者在本地调试时临时使用(未提交的修改)?
实现方案
1. 全局宏强制默认使用Nice Mock
在项目的公共测试头文件(比如test_common.h)中添加以下代码:
// 强制默认使用Nice Mock,禁止直接使用Naggy Mock #define Mock NiceMock
所有直接声明Mock<XXX>的代码都会被替换为NiceMock<XXX>,从根源上避免Naggy Mock的常规使用。
2. CI阶段的校验机制
在CI脚本中添加检查步骤,扫描代码库中是否存在直接使用Mock<(未被宏替换的原始Naggy Mock声明)的情况:
# 示例:扫描测试代码目录,发现直接使用Mock<的情况则报错 if grep -r "Mock<" --include="*.cpp" --include="*.h" ./test_dir; then echo "错误:禁止直接使用Naggy Mock,请使用NiceMock或通过本地临时修改调试" exit 1 fi
3. 本地调试的临时豁免方式
开发者如果需要在本地调试时临时使用Naggy Mock,可以在自己的测试文件顶部添加以下代码(注意不要提交到版本库):
#undef Mock #define Mock NaggyMock
这样局部范围内会恢复使用Naggy Mock,方便调试时查看无意义调用的警告信息,同时不会触发CI校验报错。
内容的提问来源于stack exchange,提问作者Xeverous
相关产品推荐
相关产品推荐

