You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 20:09:03