Gmock如何正确校验方法不会被传入特定参数调用?
Gmock校验特定参数不会被调用的正确实现
问题原因
你遇到的报错是因为Gmock默认对未匹配到显式期望的调用会判定为意外调用,直接触发测试失败。你只配置了method("321")的调用次数期望,当业务代码传入"123"调用时,没有对应的期望配置允许这次调用,因此测试失败,并不是你设置的Times(0)规则不生效(报错信息里也明确标注了"321"的调用确实发生了0次,是符合期望的)。
解决方案
方案1:显式配置双期望规则
利用Gmock的匹配优先级规则(后定义的期望优先匹配),先配置通用的任意参数允许调用规则,再配置特定参数禁止调用的规则:
// 引入Gmock的匹配器和次数配置 using ::testing::_; using ::testing::AnyNumber; // 先配置通用规则:任意参数的method调用都被允许,次数不限 EXPECT_CALL(mock, method(_)).Times(AnyNumber()); // 再配置特殊规则:参数为"321"的调用绝对不允许发生 EXPECT_CALL(mock, method("321")).Times(0);
这种方式不需要修改mock对象的定义,规则明确,适合大多数场景。
方案2:使用NiceMock包装mock对象
NiceMock会自动忽略所有未匹配到显式期望的调用,不会触发失败,此时你原本的写法就可以正常工作:
// 定义mock对象时用NiceMock包装,替换MockYourInterface为你实际的mock类名 NiceMock<MockYourInterface> mock; // 仅需要配置禁止的特定参数规则即可 EXPECT_CALL(mock, method("321")).Times(0);
这种方式写法更简洁,适合不需要严格校验所有调用的测试场景。
内容的提问来源于stack exchange,提问作者ibse
相关产品推荐
相关产品推荐

