我目前没有成功模拟返回unique_ptr的接口。例如,给定
struct IFoo {
virtual std::unique_ptr<IFoo> foo = 0;
};
int main()
{
MockRepository mocks;
auto foo = mocks.Mock<IFoo>();
mocks.OnCall( foo, IFoo::foo )
.Return( std::unique_ptr<IFoo>() );
}
由于Return
实现复制了unique_ptr
Call &Return(Y obj) { retVal = new ReturnValueWrapper<Y>(obj); return *this; }
并且期望尝试返回unique_ptr
template <typename Z>
Z MockRepository::DoExpectation(base_mock *mock, std::pair<int, int> funcno, const base_tuple &tuple)
{
...
return ((ReturnValueWrapper<Z> *)call->retVal)->rv;
}
我按照建议for a similar problem with returned references尝试了Do
。
我也尝试编写自己生成unique_ptr的ValueWrapper<T>
,但某些地方的值总是被复制。现在我已经没想完了。
答案 0 :(得分:2)
该问题的一个解决方案是使用另一个方法创建一个派生接口,该方法将返回值作为临时值返回
template <class T>
class TypedReturnValueHolder : public ReturnValueHolder {
public:
virtual T rv() = 0;
};
并修改原始ReturnValueHolder
template <class T>
class ReturnValueWrapper : public ReturnValueHolder {
public:
typename no_cref<T>::type rv;
ReturnValueWrapper(T rv) : rv(rv) {}
};
继承并实现派生接口。
template <class T>
class ReturnValueWrapper : public TypedReturnValueHolder<T> {
typename no_cref<T>::type prv;
public:
ReturnValueWrapper(T rv) : prv(rv) {}
virtual T rv() { return prv; };
};
完成后,DoExpectation
的回复可写为
if (call->retVal)
return ((TypedReturnValueHolder<Z> *)call->retVal)->rv();
重写为使用Do
mocks.OnCall( foo, IFoo::foo )
.Do( [](){ return std::unique_ptr<IFoo>(); } );
然后编译并按预期运行。