我正在尝试引用模拟方法getData的out参数。我的问题是“ ControlData”没有副本构造函数,因为它被删除了。据我了解,“ SetArgReferee”确实会在通过引用传递之前创建中间对象。
MOCK_METHOD1(getData, void(ControlData& par_rcl_ControlData));
ControlData loc_data;
EXPECT_CALL(loc_cl_control, getData(_)).WillOnce(SetArgReferee<0>(loc_data));
我尝试创建自定义操作,例如:
ACTION_P(SetArgRef, obj) { arg0 = &obj; }
但是很遗憾,这也无法编译。如何直接在模拟方法上传递对象?
引用GoogleMock Cook Book的形式:
SetArgPointee()
方便地对传递给它的值进行内部复制,从而无需将值保留在范围内并保持活动状态。但是,这意味着该值必须具有复制构造函数和赋值运算符。
[SetArgReferee
大概相同。这意味着您需要一个自定义操作将对象移动到该引用中(无需在任何位置使用复制构造函数)。
幸运的是,稍后有一个建议:
但是我们如何使用接受仅移动参数的方法?答案是它们可以正常工作,尽管当任何一个方法的参数为仅移动参数时,某些动作都不会编译。您始终可以使用Return或lambda或函子:
您需要的是一个lambda(或任何函数对象),它将通过移动传递参数:
ControlData loc_data;
auto SetArgByMove = [&loc_data](auto& arg){arg = std::move(loc_data);};
EXPECT_CALL(loc_cl_control, getData(_)).WillOnce(Invoke(SetArgByMove));
这应该可以编译并正常运行。