hipomocks——模拟返回一个unique_ptr的函数

HippoMocks - mocking a function that returns a unique_ptr

本文关键字:unique ptr 函数 一个 返回 模拟 hipomocks      更新时间:2023-10-16

我目前没有成功模拟返回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,但在某个地方的值总是被复制。现在我已经没有主意了。

这个问题的一个解决方案是创建一个带有附加方法的派生接口,该方法将返回值作为临时的

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

然后按预期编译并运行