【问题标题】:Avoid calling base class with Google Mock避免使用 Google Mock 调用基类
【发布时间】:2019-05-21 05:31:36
【问题描述】:

我正在尝试模拟一个库提供的类。该类有一个非常昂贵的构造函数(运行大约需要 30 秒),我想避免调用它。任何实际的类功能都不需要工作,我只需要一个可以用来查看是否调用了正确方法的模拟对象。

class MockClass : public BaseClass
{
  public:
    MockClass();

    MOCK_CONST_METHOD1(methodA, void(const typeA a));
    MOCK_CONST_METHOD1(methodB, void(int b));
    MOCK_CONST_METHOD3(methodC, bool(double c, double d, int e));
};

我想要类似上面的设置,但它仍然会尝试调用默认构造函数。

我怎样才能解决这个问题?

【问题讨论】:

    标签: c++ googletest googlemock gmock


    【解决方案1】:

    要构造 MockClass 对象 - 无论如何都应该调用 BaseClass 构造函数之一。

    如果BaseClass 有另一个(用户定义的)构造函数,它可以用于模拟场景 - 显式调用它:

    class MockClass : public BaseClass
    {
      public:
        MockClass() : BaseClass(/* c-tor args */) {}
    
        // ...
    };
    

    如果没有这样的构造函数 - 您将需要添加它(可以使其在常规 BaseClass 使用上下文中无法访问)。 [编辑:因为它是一个库类 - 添加构造函数很可能不是一种选择]

    另一个可能的方向是为BaseClass引入纯接口类并模拟它而不是直接模拟BaseClass。在这种情况下BaseClass 的使用应该切换到新的接口使用,接口实现将包装BaseClass 并将所需的方法调用转发到内部BaseClass 对象。因此,无需添加用于测试目的的额外 BaseClass 构造函数。

    【讨论】:

    • --> “另一个可能的方向是为 BaseClass 引入纯接口类并模拟它,而不是直接模拟 BaseClass。”这可能是最干净的解决方案。为这个建议点赞。
    【解决方案2】:

    我最终将要测试的类模板化,如here 所述。对测试使用一个模板实例化,对生产使用一个模板实例化。

    template <class Class>
    class ClassToBeTested
    {
      public:
        method(std::shared_ptr<Class> foo)
        {
            foo->do_something();
        }
    }
    

    那么,在测试中:

    TEST(test_case, test_name)
    {
        ClassToBeTested<MockClass> bar;
    }
    

    并且在生产代码中:

    int main(int argc, char *argv[])
    {
        ClassToBeTested<BaseClass> bar;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-30
      • 2021-04-02
      • 2017-03-17
      • 2017-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多