如何在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
相关产品推荐
相关产品推荐

