Xcode中使用Google Mock的TEST_F宏报错,请求排查原因
排查Google Mock Fixture测试中的"Call to non static member function without an object argument"报错
我之前在Xcode里折腾Google Mock的Fixture测试时,也踩过这个坑,这个报错基本都是代码里调用非静态成员函数的方式不对导致的,咱们从这几个方向排查:
1. 直接用类名调用非静态成员函数
如果你在TEST_F里直接用Fixture类的名字(比如FixtureShow::xxx())去调用它的非静态成员函数,就会触发这个错误。因为非静态成员函数必须依附于类的实例才能调用,而TEST_F框架已经帮你创建了Fixture的实例,直接调用成员函数或者用this->xxx()就行。
举个反例(错误写法):
class FixtureShow : public testing::Test { protected: int getTestValue() { return 5; } }; TEST_F(FixtureShow, areaValid) { // 错误:用类名调用非静态成员函数 int val = FixtureShow::getTestValue(); }
修正后的写法:
TEST_F(FixtureShow, areaValid) { // 正确:直接调用成员函数(隐式使用this指针) int val = getTestValue(); // 或者显式用this int val2 = this->getTestValue(); }
2. Mock对象的EXPECT_CALL写错了对象
如果你的Fixture里包含了Mock类的实例,在设置EXPECT_CALL的时候,要是不小心用了Mock类的名字而不是实例对象,也会报这个错。因为Mock的方法都是非静态的,必须绑定到具体实例上。
反例(错误写法):
class MockShape : public Shape { public: MOCK_METHOD(int, area, (), (const)); }; class FixtureShow : public testing::Test { protected: MockShape mock_shape; }; TEST_F(FixtureShow, areaValid) { // 错误:用Mock类名代替实例对象 EXPECT_CALL(MockShape, area()) .WillOnce(testing::Return(10)); }
修正后的写法:
TEST_F(FixtureShow, areaValid) { // 正确:用Fixture里的mock对象实例 EXPECT_CALL(mock_shape, area()) .WillOnce(testing::Return(10)); int result = mock_shape.area(); EXPECT_EQ(result, 10); }
3. Fixture类的继承或成员声明有误
检查你的Fixture类是不是正确继承了testing::Test,比如有没有漏掉public修饰符(如果成员函数是protected的话,继承方式不对会导致访问问题)。另外也要确认Fixture里的成员函数有没有被误声明为静态,或者反过来。
比如错误的继承写法:
// 错误:少了public,导致testing::Test的成员无法被正确访问,间接引发调用问题 class FixtureShow : testing::Test { // ... };
修正:
// 正确:public继承testing::Test class FixtureShow : public testing::Test { protected: // 成员函数和变量放在protected里,方便TEST_F访问 };
如果排查完这几点还是有问题,可以把你的Fixture类定义和TEST_F的代码片段贴出来,能更精准定位问题~
内容的提问来源于stack exchange,提问作者gaurav singh
相关产品推荐
相关产品推荐

