能否在GMock的Mock类构造函数中设置方法默认行为?该写法是否合法有效?
关于Google Mock构造函数中设置默认行为的合法性问题
你的写法不合法,也无法正常工作,原因如下:
Google Mock(GMock)的模拟方法依赖内部状态管理结构存储ON_CALL定义的默认行为,但这些结构在类构造函数执行期间并未完全初始化。在构造函数中调用ON_CALL(*this, ...)时,GMock无法正确记录这些默认行为配置,最终导致调用模拟方法时不会返回预期的默认值,甚至可能触发程序崩溃等未定义行为。
正确的实现方式
如果你想给Mock类的方法预设默认行为,推荐以下几种方案:
创建对象后手动配置
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));封装初始化方法
将默认行为配置放在专门的初始化方法中,创建对象后调用: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();结合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
相关产品推荐
相关产品推荐

