在构造函数中模拟函数调用

时间:2019-12-04 10:21:46

标签: c++ unit-testing googletest gmock

我已经建立了我要进行单元测试的文件管理器(基本上是读/写)类。文件格式基本上属于第三方,对此我在构造函数中具有第三方函数调用。我通过包装方法调用了所有第三方调用 我的问题是这样的:在开始对类中的任何方法进行单元测试之前,我试图实例化看起来像这样的构造函数:

Filemanager::Filemanager{

if(wrapperfoo()){
   file->open() //for writing
}

initialise();
}

现在我有一个模拟类MockManager来模拟Filemanager。当我尝试实例化MockManager时, 我需要模拟wrapperoo以返回true。但是,由于还没有实例化管理器本身,因此EXPECT_CALL失败。由于必须将EXPECT_CALL放置在新的MockManager()之前

MockManager *mgr;
EXPECT_CALL(*mgr, wrapperfoo()).Return(true) // Crashes here.. Obviously!!
mgr = new MockManager();

该如何处理?

1 个答案:

答案 0 :(得分:0)

我看不到有任何可行的方法,您被迫建立一种解决方法。您已经自己给出了解释。

原则上,模拟并不是为您要实现的目的而设计的,它是为测试组件在API或接口上的行为而设计的,您可以在其中模拟组件的接口(API),反之亦然({ {3}},很好的解释)。在此示例中,您不会对内部调用(从构造函数)进行模拟,而是在另一个组件的测试用例中,该组件要求从wrapperfoo()获取返回类型。