有一個被測試的類,它目前在其構造函數中接受一個unique_ptr<Interface>&&
,表示它想要對接口實現進行單一所有權。當想要使用模擬Interface
來測試這個類時出現了問題:雖然模擬框架(HippoMocks)只給我提供了我不擁有的Interface*
,因此不能刪除。單元測試,模擬和unique_ptr
我測試類以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並沒有真正奏效,是因爲在deleter是一個模板參數:
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>);
}
「來表示,它希望採取的接口實現的單一所有權。」而應採取'按值unique_ptr'來表達,而不是''&&。 –
「嘲諷框架給我只有我不擁有的Interface *,因此不能刪除。」你不能改變嘲笑框架讓你擁有它嗎?如果你的界面需要所有權,那麼你的模擬框架需要*測試*所有權。否則,你不是真的在測試它。 –
@NicolBolas關於價值的好處,我會把它留在外面,因爲它對這個問題沒有用處。由嘲諷框架返回的指針不指向任何使用標準new/malloc/whatever分配的任何東西,它只是擺弄vtable,所以它不是可以擁有的東西。 – stijn