HippoMocks - 模拟返回unique_ptr的函数

Tho*_*mas 6 c++ mocking c++11 hippomocks

我目前没有成功模拟返回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>() );
}
Run Code Online (Sandbox Code Playgroud)

这无法编译,因为该Return实现创建了unique_ptr的副本

Call &Return(Y obj) { retVal = new ReturnValueWrapper<Y>(obj); return *this; }
Run Code Online (Sandbox Code Playgroud)

并期望尝试返回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;
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试过Do,就像返回引用的类似问题所建议那样.

我也尝试编写自己的ValueWrapper<T>,生成一个unique_ptr,但在某处,值总是被复制.现在我已经没想完了.

Tho*_*mas 2

该问题的一种解决方案是创建一个派生接口,其中包含一个附加方法,该方法将返回值作为临时值返回

template <class T>
class TypedReturnValueHolder : public ReturnValueHolder {
public:
    virtual T rv() = 0;
};
Run Code Online (Sandbox Code Playgroud)

并且他们修改了原来的ReturnValueHolder

template <class T>
class ReturnValueWrapper : public ReturnValueHolder {
public:
typename no_cref<T>::type rv;
ReturnValueWrapper(T rv) : rv(rv) {}
};
Run Code Online (Sandbox Code Playgroud)

继承并实现派生接口。

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; };
};
Run Code Online (Sandbox Code Playgroud)

完成后,返回DoExpectation可以写为

        if (call->retVal)
            return ((TypedReturnValueHolder<Z> *)call->retVal)->rv();
Run Code Online (Sandbox Code Playgroud)

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

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

然后按预期编译并运行。