Возможный обходной путь для устранения проблем, связанных с использованием mock-фреймворка Google с неконстантными копируемыми аргументами функций и значениями повтора, - это использование прокси-методов mock.1003 * таким образом, кажется более или менее философским вопросом, лично мне нравится, чтобы он принудил передачу права собственности):
class IFooInterface {
public:
virtual void nonCopyableParam(std::unique_ptr<IMyObjectThing> uPtr) = 0;
virtual std::unique_ptr<IMyObjectThing> nonCopyableReturn() = 0;
virtual ~IFooInterface() {}
};
Подходящий класс-образец может быть определен так:
class FooInterfaceMock
: public IFooInterface {
public:
FooInterfaceMock() {}
virtual ~FooInterfaceMock() {}
virtual void nonCopyableParam(std::unique_ptr<IMyObjectThing> uPtr) {
nonCopyableParamProxy(uPtr.get());
}
virtual std::unique_ptr<IMyObjectThing> nonCopyableReturn() {
return std::unique_ptr<IMyObjectThing>(nonCopyableReturnProxy());
}
MOCK_METHOD1(nonCopyableParamProxy,void (IMyObjectThing*));
MOCK_METHOD0(nonCopyableReturnProxy,IMyObjectThing* ());
};
Вам просто нужно позаботиться о том, чтобы конфигурации (выполненные действия) для метода nonCopyableReturnProxy()
возвращали либо NULL
, либо экземпляр, динамически выделяемый в куче.
Есть ветка форума пользователей google-mock обсуждает эту тему, где один из сопровождающих заявляет, что структура google-mock не будет изменена для поддержки этого в будущем, утверждая, что их политика настоятельно не рекомендует использовать параметры std::auto_ptr
.Как уже упоминалось, это ИМХО с философской точки зрения, и возможности фальшивой инфраструктуры не должны определять, какие интерфейсы вы хотите разрабатывать или можете использовать из сторонних API.
Как сказано, ответ описывает выполнимый обходной путь.