在C++中我们可能会遇到函数名, 函数签名, 返回值都相同的重载, 唯一的区别是const和non-const, 例如:

1
2
3
4
5
6
class SomeClass {
public:
virtual ~SomeClass() throw() {}
virtual int get() = 0;
virtual int get() const = 0;
};

这种类我们在使用时编译器会根据我们的传入对象是否带有const属性自动调用对应的版本, 但是通过GMOCK的编写Mock调用时, 很多人对如何设置const函数的EXPECT_ALL和调用产生了疑问.
其实处理方式也比较简单, 在使用EXPECT_CALL或者调用mock对象的方法时, 我们可以显示通过const_cast将mock对象的转为const版本.
例如对于上面的类, 我们可以这么去写Mock, 设置期望和调用:

1
2
3
4
5
6
class SomeClassMock : public SomeClass {
public:
virtual ~SomeClassMock() throw() {}
MOCK_METHOD0(get, int());
MOCK_CONST_METHOD0(get, int());
};
1
2
3
4
5
6
7
8
9
10
11
TEST(ConstMock, ShouldCallConstFunction) {
SomeClassMock mock;
EXPECT_CALL(mock, get())
.WillRepeatedly(Return(1));
EXPECT_CALL(const_cast<const SomeClassMock&>(mock), get())
.WillRepeatedly(Return(2));
ASSERT_EQ(1, mock.get());
ASSERT_EQ(2, const_cast<const SomeClassMock&>(mock).get());