避免使用Google Mock调用基类

时间:2019-05-21 05:31:37

标签: c++ googletest googlemock gmock

我正在尝试模拟图书馆提供的类。该类有一个非常昂贵的构造函数(需要30秒钟才能运行),我希望避免调用它。实际的类功能都不需要工作,我只需要一个模拟对象即可查看是否调用了正确的方法。

c

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

我该如何解决?

2 个答案:

答案 0 :(得分:1)

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

如果BaseClass具有模拟场景可以接受的另一个(用户定义)构造函数,请明确调用:

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

    // ...
};

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

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

答案 1 :(得分:0)

我最终对要测试的类进行了模板化,如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;
}