6

我目前没有成功模拟返回 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;
}

我已经尝试过Do,正如针对返回引用的类似问题所建议的那样。

我也尝试过编写自己的ValueWrapper<T>生成 unique_ptr 的方法,但值总是在某处被复制。现在我已经没有想法了。

4

1 回答 1

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; };
};

一旦完成,return fromDoExpectation可以写为

        if (call->retVal)
            return ((TypedReturnValueHolder<Z> *)call->retVal)->rv();

重写时使用的问题中的示例Do

mocks.OnCall( foo, IFoo::foo )
     .Do( [](){ return std::unique_ptr<IFoo>(); } );

然后按预期编译和运行。

于 2013-03-01T17:12:29.500 回答