【问题标题】:How do I mock non overridden, virtual/non virtual methods of a base class while unit testing?如何在单元测试时模拟基类的非覆盖、虚拟/非虚拟方法?
【发布时间】:2011-10-22 18:35:11
【问题描述】:

如何在基类中模拟非覆盖的非虚拟/虚拟方法并仅测试派生类的方法? 这里的情况是: 我有一个基类 X,它具有连接到外部服务器并执行其他一些操作的方法。 我有一个派生自 X 的类 Y。我在 Y 中实现了两个方法。我只想对它们进行单元测试。我只担心这两种方法,我不希望调用基类实现来连接服务器等(我想模拟这些方法,但我不想在派生类中覆盖这些方法Y 并且什么都不做,因为它是生产代码)。 关于如何单独对这些方法进行单元测试的任何想法/想法?

P.S:我正在使用 C++/GTest 进行开发和单元测试。

【问题讨论】:

    标签: c++ unit-testing googletest gmock


    【解决方案1】:

    一种选择是在测试目录中创建一个 Mock_base 类和继承自它的类 Derived。现在用什么都不做的函数来模拟实际 Base 中你不感兴趣的任何实现。例如 Mock_base::Connect() 可能会返回 SUCCESS 返回码。这样您就可以在不修改源代码的情况下对 Derived:funcs() 进行单元测试。

    【讨论】:

    • 好主意,或者将Derived 设为继承自其模板参数的模板类:template<typename Base> Y : public Base {...
    【解决方案2】:

    你真的很幸运,你很难做到这一点!

    功能性大部分时间不打算通过继承重用,这是一个很好的理由:您的基类实现了一些您想为 client 模拟的接口(即是)。可能以后这个功能也可以由其他一些类实现,并且 Y 应该能够使用 那个新的、可能更好的实现。

    Y 拥有/使用一个 X,但Y 不是一个 X。

    如果您的 Y 类需要使用 X 的功能(连接到服务器等...),它应该聚合它,而不是继承它。

    您会注意到聚合方案允许像这样进行模拟。

    【讨论】:

      猜你喜欢
      • 2012-06-19
      • 2012-07-29
      • 1970-01-01
      • 2018-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多