HippoMocks — насмешливая функция, которая возвращает unique_ptr

В настоящее время мне не удается издеваться над интерфейсом, который возвращает 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, но где-то значение всегда копируется. Прямо сейчас у меня закончились идеи.

6

Решение

Одним из решений проблемы является создание производного интерфейса с дополнительным методом, который возвращает возвращаемое значение в качестве временного

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

затем компилируется и запускается как ожидалось.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]