对Google Mock返回的引用所做的更改是否可以反映在原始值中?

时间:2013-05-01 02:07:29

标签: c++ googlemock

Google Mock返回的引用所做的更改是否可以反映在原始值中?

示例测试代码(使用CppUnit作为单元测试框架):

int i = 0;
EXPECT_CALL(mock, GetValue())
    .WillOnce(ReturnRef(i));

...

CPPUNIT_ASSERT_EQUAL( 1, i );

示例代码:

auto x = obj.GetValue();
++x;

我的测试表明,这不会更新i的值,但Google对ReturnRefReturnRefOfCopy的描述似乎意味着这应该有效,即

  • ReturnRef(variable) - 返回对变量的引用。
  • ReturnRefOfCopy(value) - 返回对值副本的引用;只要行动,副本就会存在。

相反,似乎ReturnRef也会返回对副本的引用。有没有办法使用Google Mock获得此行为?

1 个答案:

答案 0 :(得分:2)

auto使用与模板相同的类型扣除规则。在您的情况下,auto x表示与模板类型参数相同。

template<typename T>
int function(T t) { 
    T x; // <-- is equivalent to `auto x` outside of a template
};

在您的示例中,类型被推断为int而不是int&,正如您所期望的那样,这就是原始值保持不变的原因。您需要明确声明引用(auto& x)才能修改原始值。