【问题标题】:Mock function called by aggregate object using googlemock聚合对象使用 googlemock 调用的模拟函数
【发布时间】:2017-10-05 09:55:36
【问题描述】:

我有一个场景,其中实例化本地对象以调用该类的方法,即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()

【问题讨论】:

    标签: c++ unit-testing googletest googlemock


    【解决方案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 来简单地使用依赖注入。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-20
      • 1970-01-01
      • 2011-01-28
      相关资源
      最近更新 更多