使用Google Mock如何测试func2不会被传入特定参数调用?
解答
1 全局函数func2的Mock适配
Google Mock默认针对类的虚函数实现Mock,如果你要Mock的func2是全局函数,可以做一层编译期替换的适配逻辑,无需修改原有生产代码:
#include <gmock/gmock.h> // Mock类定义 class Func2Mock { public: MOCK_METHOD(void, func2, (int), ()); }; // 全局Mock实例,测试用 extern Func2Mock g_func2_mock; // 测试环境下替换原有func2的实现,生产环境不会编译这段代码 void func2(int arg) { g_func2_mock.func2(arg); }
2 「func2不接收参数0」的测试写法
你需要的SHOULD_NOT_CALL(func2(0))等价于Google Mock的Times(0)调用次数约束,写法如下:
// 断言:测试周期内func2绝对不会被传入0调用,一旦出现该调用测试直接失败 EXPECT_CALL(g_func2_mock, func2(0)).Times(0); // 额外补充:如果要同时断言func2只会被传入3调用,可以追加以下约束 EXPECT_CALL(g_func2_mock, func2(3)).Times(1);
3 四个条件组合的完整测试用例
假设你已经可以在测试用例中控制condition1和condition2的取值,完整的组合条件覆盖测试用例示例如下:
#include <gtest/gtest.h> #include "你的生产代码头文件.h" // 包含func1、condition1、condition2的声明 using ::testing::_; Func2Mock g_func2_mock; TEST(Func1Test, 条件1真条件2真) { // 前置条件设置 condition1 = true; condition2 = true; // 调用预期 EXPECT_CALL(g_func2_mock, func2(0)).Times(1); // 执行被测逻辑 func1(); } TEST(Func1Test, 条件1真条件2假) { condition1 = true; condition2 = false; EXPECT_CALL(g_func2_mock, func2(0)).Times(0); EXPECT_CALL(g_func2_mock, func2(3)).Times(1); func1(); } TEST(Func1Test, 条件1假条件2真) { condition1 = false; condition2 = true; EXPECT_CALL(g_func2_mock, func2(0)).Times(0); EXPECT_CALL(g_func2_mock, func2(3)).Times(1); func1(); } TEST(Func1Test, 条件1假条件2假) { condition1 = false; condition2 = false; EXPECT_CALL(g_func2_mock, func2(0)).Times(0); EXPECT_CALL(g_func2_mock, func2(3)).Times(1); func1(); } int main(int argc, char **argv) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }
补充说明
如果不需要严格校验非0场景下传入的值一定是3,仅需保证不会传0,可以只保留func2(0)的Times(0)约束,再追加EXPECT_CALL(g_func2_mock, func2(_)).Times(1)来保证func2确实被调用了1次,避免漏测func1未执行func2的异常场景。
内容的提问来源于stack exchange,提问作者Mafalda Hopkirk
相关产品推荐
相关产品推荐

