2012-08-02 70 views
3
IEmployeeServiceProxy* empSvcMock = m_Mocks.InterfaceMock<IEmployeeServiceProxy>(); 
m_EmpSvcMock.reset(empSvcMock); // shared_ptr because my class Client ctor expects a shared_ptr<IEmployeeServiceProxy> 

Client client(m_EmpSvcMock); 

如何防止m_EmpSvcMock被HippoMock内部破坏?将模拟传递给shared_ptr时,两者都会破坏模拟。HippoMocks坚持摧毁模拟

编辑 - 答:

m_Mocks.ExpectCallDestructor(m_EmpSvcMock.get()); 
m_EmpSvcMock.reset(); 

回答

2

在Git版本(从Assembla),你可以告诉它注册一个被调用的析构函数。额外的好处是,它会警告你之后使用ZombieMockException调用它的函数,所以如果你确实在某个地方泄漏了一个指针并且它被使用了,你就会知道一个可读的错误。

+0

所以当把模拟传给shared_ptr时,我们应该简单地注册一个NOP析构函数?你能举个例子吗? – 2012-08-02 07:57:29

+0

+1这听起来很有意思 – stijn 2012-08-02 07:59:19

+0

将它传递给共享指针时,您希望在测试结束时但在验证模拟之前调用析构函数。所以,告诉模拟库,你很好。这是它的单元测试http://www.assembla.com/code/hippomocks/git/nodes/master/HippoMocksTest/test_zombie.cpp,它明确地删除它,但这相当于最后一个被破坏的共享指针。 – dascandy 2012-08-02 08:03:23

2

使用辅助这样的,它与无操作删除器创建一个shared_ptr:

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

template< class T > 
std::shared_ptr<T> make_shared_ref(T* t) 
{ 
    return std::shared_ptr<T>(t, NoDelete<T>); 
} 

    //usage 
m_EmpSvcMoc = make_shared_ref(empSvcMock); 
+0

是的,我知道这个'解决方案'(黑客),但我希望HippoMock的作者会评论隐含地管理嘲笑释放的必要性。顺便说一句,你的意思是m_EmpSvcMock = make_shared_ref(empSvcMock); – 2012-08-02 07:51:48

+0

谢谢,修正了使用 – stijn 2012-08-02 07:58:48