避免使用 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;
}
我正在尝试模拟图书馆提供的 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;
}