避免使用 Google Mock 调用 base class

Avoid calling base class with Google Mock

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

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));
};

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

我该如何解决这个问题?

要构造 MockClass 对象 - BaseClass 构造函数之一应该被调用。

如果 BaseClass 有另一个 (user-defined) 构造函数,模拟场景可以接受 - 显式调用它:

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

    // ...
};

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

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

我最终将要测试的 class 模板化,如 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;
}