带有已删除构造函数的gock模拟输出参数引用

问题描述 投票:0回答:1

我正在尝试引用模拟方法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; }

但是很遗憾,这也无法编译。如何直接在模拟方法上传递对象?

unit-testing testing googletest gmock googlemock
1个回答
0
投票

引用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));

这应该可以编译并正常运行。

© www.soinside.com 2019 - 2024. All rights reserved.