使用googlemock通过聚合对象调用的模拟函数

时间:2017-10-05 09:55:37

标签: c++ unit-testing googletest googlemock

我的情况是在本地对象中实例化以调用该类的方法,即setSessionId()。 setSessionId的定义如下:

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

现在为了模拟SessionHandler的函数我已经使用宏在我想要模拟的函数之前添加virtual关键字,在本例中为getSessionId(),因为这个类不是抽象的函数不是纯虚函数。(我知道Hi-Perf依赖注入但不想在这个阶段进入它)

如果是这样的话

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

将模拟对象传递给函数setSessionid()会很简单但是由于使用了聚合,我该如何模拟这个函数getSessionId()

1 个答案:

答案 0 :(得分: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来简单地使用依赖注入。

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