繁体   English   中英

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

[英]Mock function called by aggregate object using 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()

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

对于静态多态性,您可以执行以下操作:

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 来简单地使用依赖注入。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM