2017-10-05 152 views
1

通过聚合对象称为模拟功能I含有S情形,即本地对象实例来调用这个类即setSessionId()的方法。 setSessionId的界定及如下:使用googlemock

int Cli::setSessionId() 
{ 
    SessionHandler oHandleSession; 
    return oHandleSession.getSessionId(sSessionId); 
} 

现在为了的SessionHandler模拟功能我用宏我想嘲笑功能之前添加virtual关键字,在这种情况下getSessionId()因为这个类不是抽象和功能不是纯虚函数。(我知道的Hi-逆足依赖注入,但不希望它去在这个阶段)

已而言,这

int Cli::setSessionId(SessionHandler* oHandleSession) 
{ 
    ... 
    return oHandleSession->getSessionId(sSessionId); 
} 

这本来是简单到只PA将嘲讽的对象转换为函数setSessionid(),但由于使用了聚合,我该如何模拟此功能getSessionId()

回答

1

您可以使用静态多态,也可以使用链接时替换。

对于静态多态性你做这样的事情:

class DefaultSessionHandler { 
    // methods implemented as you do now 
}; 

template <typename T> 
class SessionHandlerT { 
    // methods implemented in terms of delegation to methods on T 
}; 

using SessionHandler = SessionHandlerT<DefaultSessionHandler>; 

这可有点繁琐,可以引入额外的编译时间,同时也可以进行工作,我没有太大的风扇这种方法,即使我以前做过多次。

带链接时替换,您提供的替代实施方案的SessionHandler和解决在链接时的情况。这意味着你有一些SessionHandler类的其他实现,尽管它有相同的名字,但它们做了一些不同的事情。同样,这很麻烦,但可以开展工作。

这两种方法都有自己的一组,他们引进的问题和痛苦。更好的单元测试方法是通过重构SUT来简单地使用依赖注入。

另一种方法是放弃单元测试并仅执行集成测试。这也有它自己的一套问题。

相关问题