Форма цитирования GoogleMock Кулинарная книга :
SetArgPointee()
удобно создает внутреннюю копию передаваемого ей значения, устраняя необходимость сохранять значение в области видимости и живой. Однако это означает, что значение должно иметь конструктор копирования и оператор присваивания.
Предположительно, то же самое относится и к SetArgReferee
. Это означает, что вам нужно специальное действие для перемещения объекта в эту ссылку (без использования конструктора копирования в любом месте).
К счастью, позже есть предложение:
, но как мы работаем с методами, принимающими аргументы только для перемещения? Ответ в том, что они работают нормально, хотя некоторые действия не будут компилироваться, если какой-либо из аргументов метода только для перемещения. Вы всегда можете использовать Return или лямбду или функтор:
Вам потребуется лямбда (или любой объект функции), который передаст аргумент при перемещении:
ControlData loc_data;
auto SetArgByMove = [&loc_data](auto& arg){arg = std::move(loc_data);};
EXPECT_CALL(loc_cl_control, getData(_)).WillOnce(Invoke(SetArgByMove));
This следует скомпилировать и запустить без проблем.
Возможно, вы также можете выполнить пользовательское действие, но не с помощью макроса ACTION_P
- он также создает копию объекта. Вам нужно будет написать полноценное действие, создав класс, наследующий от ActionInterface