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

如何为Google Mock的EXPECT_CALL中不同WillOnce的Lambda传预期参数?

在Google Mock中为多次调用的Mock函数传递不同验证参数

针对你遇到的问题——需要在Mock函数的多次调用中,给验证Lambda传递不同的预期结果,这里有几种简洁的实现方式:

方法1:Lambda捕获绑定预期值

把通用验证逻辑抽离成可复用的函数,然后在每个WillOnce中创建捕获对应预期值的Lambda,直接调用验证逻辑。这种方式直观易懂,适合少量调用的场景。

修改后的测试代码:

TEST(mytest, test1)
{
    DependencyMock depMock;
    Service service{&depMock};

    // 通用验证逻辑:接收实际参数和预期结果
    auto verifyFoo = [](double d, double expectedResult) {
        auto result = d + 123; // 你的复杂验证逻辑
        EXPECT_EQ(result, expectedResult);
    };

    EXPECT_CALL(depMock, foo(_))
        .Times(2)
        // 第一次调用:预期结果为1.2 + 123 = 124.2
        .WillOnce(Invoke([&verifyFoo](double d) { verifyFoo(d, 124.2); }))
        // 第二次调用:预期结果为2.3 + 123 = 125.3
        .WillOnce(Invoke([&verifyFoo](double d) { verifyFoo(d, 125.3); }));

    service.doStuff();
}

方法2:使用std::bind绑定额外参数

如果不想嵌套Lambda,可以用std::bind把预期值绑定到验证函数的参数上,直接传递给Invoke。这种方式更适合复用已有的验证函数。

修改后的测试代码:

TEST(mytest, test1)
{
    DependencyMock depMock;
    Service service{&depMock};

    // 通用验证函数:注意参数顺序,Mock的参数在前,额外参数在后
    auto verifyFoo = [](double d, double expectedResult) {
        auto result = d + 123; // 你的复杂验证逻辑
        EXPECT_EQ(result, expectedResult);
    };

    EXPECT_CALL(depMock, foo(_))
        .Times(2)
        // 绑定预期值124.2作为验证函数的第二个参数
        .WillOnce(Invoke(std::bind(verifyFoo, std::placeholders::_1, 124.2)))
        // 绑定预期值125.3作为验证函数的第二个参数
        .WillOnce(Invoke(std::bind(verifyFoo, std::placeholders::_1, 125.3)));

    service.doStuff();
}

方法3:队列存储预期值(适合多次调用场景)

如果Mock函数会被调用很多次,可以用队列存储所有预期结果,每次验证时取出一个。这种方式避免重复编写多个WillOnce,代码更简洁。

修改后的测试代码:

TEST(mytest, test1)
{
    DependencyMock depMock;
    Service service{&depMock};

    // 预存所有预期结果,顺序要和Mock函数调用顺序一致
    std::queue<double> expectedResults;
    expectedResults.push(124.2);
    expectedResults.push(125.3);

    auto verifyFoo = [&expectedResults](double d) {
        auto result = d + 123; // 你的复杂验证逻辑
        EXPECT_EQ(result, expectedResults.front());
        expectedResults.pop();
    };

    EXPECT_CALL(depMock, foo(_))
        .Times(2)
        .WillRepeatedly(Invoke(verifyFoo));

    service.doStuff();
}

内容的提问来源于stack exchange,提问作者jviita

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 20:22:42