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

能否在GMock的Mock类构造函数中设置方法默认行为?该写法是否合法有效?

关于Google Mock构造函数中设置默认行为的合法性问题

你的写法不合法,也无法正常工作,原因如下:

Google Mock(GMock)的模拟方法依赖内部状态管理结构存储ON_CALL定义的默认行为,但这些结构在类构造函数执行期间并未完全初始化。在构造函数中调用ON_CALL(*this, ...)时,GMock无法正确记录这些默认行为配置,最终导致调用模拟方法时不会返回预期的默认值,甚至可能触发程序崩溃等未定义行为。

正确的实现方式

如果你想给Mock类的方法预设默认行为,推荐以下几种方案:

  1. 创建对象后手动配置

    struct SuperMock {
      MOCK_CONST_METHOD(mockedMethod1, int());
      MOCK_CONST_METHOD(mockedMethod2, int());
    };
    
    // 使用时
    SuperMock mock;
    ON_CALL(mock, mockedMethod1).WillByDefault(Return(1));
    ON_CALL(mock, mockedMethod2).WillByDefault(Return(2));
    
  2. 封装初始化方法
    将默认行为配置放在专门的初始化方法中,创建对象后调用:

    struct SuperMock {
      MOCK_CONST_METHOD(mockedMethod1, int());
      MOCK_CONST_METHOD(mockedMethod2, int());
    
      void SetupDefaults() {
        ON_CALL(*this, mockedMethod1).WillByDefault(Return(1));
        ON_CALL(*this, mockedMethod2).WillByDefault(Return(2));
      }
    };
    
    // 使用时
    SuperMock mock;
    mock.SetupDefaults();
    
  3. 结合Google Test的SetUp方法
    如果是在Google Test测试框架中使用,可以在测试夹具的SetUp()方法中完成Mock对象的初始化和默认行为配置:

    class MyTestFixture : public testing::Test {
    protected:
      void SetUp() override {
        ON_CALL(mock_, mockedMethod1).WillByDefault(Return(1));
        ON_CALL(mock_, mockedMethod2).WillByDefault(Return(2));
      }
    
      SuperMock mock_;
    };
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 08:30:02