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

如何在GMock中实现Mock对象交替返回值,避免重复编写WillOnce语句?

在GMock中优雅实现Mock对象交替返回不同值的方法

当然有更优雅的方式,不用反复复制WillOnce语句,以下是两种常用方案:

方案一:使用ReturnAlternately + WillRepeatedly

GMock内置的ReturnAlternately动作可以直接实现循环交替返回指定值的需求,配合WillRepeatedly就能让Mock对象无限次交替返回值:

EXPECT_CALL(my_mock, foo(_))
    .WillRepeatedly(ReturnAlternately(A, B));

这段代码会让my_mock.foo()的调用结果按A→B→A→B→...的顺序无限循环返回。如果需要限制调用次数,加上Times()即可:

// 仅交替返回6次(A、B各3次)
EXPECT_CALL(my_mock, foo(_))
    .Times(6)
    .WillRepeatedly(ReturnAlternately(A, B));

甚至可以扩展到多个值的循环,比如传入三个参数就会按A→B→C→A→B→C→...的顺序返回。

方案二:自定义动作(适合复杂逻辑)

如果需要更灵活的交替规则(比如根据调用参数调整返回值),可以用Invoke配合自定义lambda表达式实现:

int call_count = 0;
EXPECT_CALL(my_mock, foo(_))
    .WillRepeatedly(Invoke([&call_count]() {
        // 按调用次数奇偶性返回不同值
        return (call_count++ % 2 == 0) ? A : B;
    }));

这种方式适合超出简单交替的场景,比如需要根据调用次数做额外逻辑处理的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 01:33:16