Модульное тестирование, имитация и unique_ptr

Существует тестируемый класс, который в настоящее время принимает unique_ptr< Interface >&&в своем конструкторе, чтобы выразить, что он хочет единолично владеть реализацией интерфейса. Проблемы возникают при желании протестировать этот класс с использованием фиктивного Interface: фиктивная структура (HippoMocks) дает мне только Interface*, которым я не владею, поэтому не могу удалить.

У меня была та же проблема раньше, когда я тестировал классы, использующие const shared_ptr< Interface >&в качестве аргументов, но исправил это, предоставив пользовательское средство удаления без операций:

template< class T >
void NoDelete( T* )
{
}

  //create a shared_ptr without effective deleter
template< class T >
std::shared_ptr< T > mock_shared( T* t )
{
  return std::shared_ptr< T >( t, NoDelete< T > );
}

Interface* iface = mocks.GetMeAMock< Interface >();
DoStuffWithSharedPtrOfInterface( mock_shared< Interface >( iface ) );

Аналогичное исправление для unique_ptr не работает. На самом деле это не сработает, потому что средство удаления является аргументом шаблона:

template< class T >
struct NoDelete
{
  void operator ()( T* )
  {
  }
};

  //oops this is totally useless since std::unique_ptr< T, NoDelete< T > >
  //is not quite the same type as std::unique_ptr< T >
template< class T >
std::unique_ptr< T, NoDelete< T > > mock_unique( T* t )
{
  return std::unique_ptr< T, NoDelete< T > >( t, NoDelete< T >() );
}

Есть ли обходной путь для этого? Или я не должен использовать здесь unique_ptr в первую очередь?

обновление Я попробовал это; должно работать, но sizeof( ptr ) теперь равен 8, трудно сказать, какое влияние это оказывает.

  //use CustomUniquePtr::type instead of uniqe_ptr
template< class T >
struct CustomUniquePtr
{
  typedef typename std::unique_ptr< T, void (*) ( T* ) > type;
}

  //use everywhere
template< class T >
CustomUniquePtr< T >::type make_unique( T* p )
{
  return CustomUniquePtr< T >::type( p, Delete< T > );
}

  //use when mocking, doe not delete p!
template< class T >
CustomUniquePtr< T >::type mock_unique( T* p )
{
  return CustomUniquePtr< T >::type( p, NoDelete< T > );
}
5
задан stijn 18 June 2012 в 09:43
поделиться