我正在尝试模拟图书馆提供的类。该类有一个非常昂贵的构造函数(需要30秒钟才能运行),我希望避免调用它。实际的类功能都不需要工作,我只需要一个模拟对象即可查看是否调用了正确的方法。
c
我想要类似上面的设置,但是它仍然尝试调用默认构造函数。
我该如何解决?
答案 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;
}