Attualmente non sto riuscendo a simulare un'interfaccia che restituisce un unique_ptr. Ad esempio, datoHippoMocks - mocking di una funzione che restituisce un 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>());
}
Questo non riesce a compilare perché l'implementazione Return
fa una copia del unique_ptr
Call &Return(Y obj) { retVal = new ReturnValueWrapper<Y>(obj); return *this; }
e l'aspettativa tenta di restituire l'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;
}
ho provato Do
, come suggerito for a similar problem with returned references.
Ho anche provato a scrivere il mio ValueWrapper<T>
che genera un unique_ptr, ma da qualche parte il valore ottiene sempre copiati. In questo momento sono a corto di idee.
Sembra che HippoMocks non sia ancora pronto per i tipi di spostamento solo di C++ 11. Forse potresti scrivere una specializzazione per 'ReturnValueWrapper>' che * non * copia internamente? –
Hai provato le versioni successive di hippomocks, che hanno una versione C++ 0x? –
@Arne Ho provato più o meno qualcosa del genere. A quanto pare all'inizio ho fatto qualcosa di sbagliato. Dopo aver dato un altro tentativo ho trovato una soluzione che funzionava. Lo aggiungerò al [repository github] (https://github.com/dascandy/hippomocks) in seguito. – Thomas