【问题标题】:Mocking a function call inside a constructor在构造函数中模拟函数调用
【发布时间】:2019-12-04 10:21:46
【问题描述】:

我已经构建了一个文件管理器(基本上是读/写)类,我正在尝试进行单元测试。文件格式基本上属于第三方,我在构造函数中有第三方函数调用。我通过包装方法调用所有第三方调用 我的问题是:在开始对类中的任何方法进行单元测试之前,我试图实例化如下所示的构造函数:

Filemanager::Filemanager{

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

initialise();
}

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

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

我该如何处理这种情况?

【问题讨论】:

  • file->open 移动到 initialise 内,然后在构造函数外调用 initialise
  • 为什么你的mock中有逻辑? Mock 不应该自己做任何事情。它只通知您它已被使用并返回您请求返回的值。仅此而已。

标签: c++ unit-testing googletest googlemock


【解决方案1】:

我认为这不可能奏效,你不得不自己建立一个解决方法。你已经自己解释过了。

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

【讨论】:

  • 我知道这本身不是一个答案,我会发表评论,但我缺乏声誉,对任何不便表示抱歉
猜你喜欢
  • 2019-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-03
相关资源
最近更新 更多