gpt4 book ai didi

c++ - 单元测试、模拟和 unique_ptr

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:11:09 25 4
gpt4 key购买 nike

有一个正在测试的类目前接受 unique_ptr< Interface >&&在它的构造函数中,表示它想要获得接口(interface)实现的单一所有权。想要使用模拟 Interface 测试此类时会出现问题虽然:模拟框架 (HippoMocks) 只给我 Interface*我不拥有,因此无法删除。

我以前在测试 const shared_ptr< Interface >& 的类(class)时遇到过同样的问题作为参数,但通过提供自定义的无操作删除器来修复:

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

最佳答案

shared_ptr 将其删除器与其他簿记数据(refcount 等)一起存储在堆上; unique_ptr 没有堆开销,因此删除器必须存储在对象中并成为类型的一部分。

您可以在 Deleter 上对构造函数进行模板化,并将 unique_ptr 转换为 shared_ptr 以删除删除器类型。

更好的方法(取决于接口(interface)的大小)是提供一个代理 Interface 对象,转发到模拟的 Interface *

关于c++ - 单元测试、模拟和 unique_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11036403/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com