使用Google Test时如何指定调用重载的非const Mock方法
解决Google Mock中区分const/非const重载Mock方法的问题
遇到这种重载的const和非const方法,Google Mock确实需要你明确指定要匹配哪一个版本——不然它可能会默认匹配const版本(因为const成员函数的适用范围更广)。这里给你两种简洁的解决方式,优先推荐第一种:
方法1:使用testing::NonConst()指定匹配非const版本
这是最直观的方式,通过testing::NonConst()修饰你的mock对象,告诉Google Mock我们要匹配的是仅能在非const对象上调用的成员函数,也就是你定义的MOCK_METHOD0(function1, bool&())版本。
完整的测试用例示例:
TEST_F(TestConfiguration, TestNonConstFunction1Call) { testMock = new TestMock(); bool target_val = true; // 定义要返回的引用值 // 关键:用testing::NonConst修饰mock对象,匹配非const版本的function1 EXPECT_CALL(testing::NonConst(*testMock), function1()) .WillOnce(testing::ReturnRef(target_val)); // 调用foo1,它会触发非const的function1 ASSERT_EQ(testMock->foo1(), true); }
方法2:显式指定函数指针类型(适合复杂重载场景)
如果遇到更复杂的重载(比如参数也不同),你可以通过显式转换函数指针的类型来指定要匹配的版本:
TEST_F(TestConfiguration, TestNonConstFunction1WithExplicitType) { testMock = new TestMock(); bool target_val = false; // 定义非const版本的函数指针类型 using NonConstFunc = bool& (TestMock::*)(); // 显式指定要匹配的函数指针 EXPECT_CALL(*testMock, testing::StaticCast<NonConstFunc>(&TestMock::function1)) .WillOnce(testing::ReturnRef(target_val)); ASSERT_EQ(testMock->foo1(), false); }
为什么会匹配到const版本?
因为const成员函数可以被const和非const对象调用,而非const成员函数只能被非const对象调用。当你直接写EXPECT_CALL(*testMock, function1())时,Google Mock无法确定你要匹配哪个重载,这时候它可能会优先选择const版本(或者直接报重载模糊的编译错误)。用testing::NonConst()就明确缩小了匹配范围,只匹配非const对象才能调用的那个方法。
内容的提问来源于stack exchange,提问作者Александр Бодров
相关产品推荐
相关产品推荐

