4

我正在使用 Google Mock 1.6 RC 并试图模拟COM Interface. COM 接口中有近 50 种方法,其中一些是从基本接口继承而来的。当我创建一个struct从该接口继承的模拟并仅模拟我正在使用的方法时,我得到了cannot instantiate abstract class错误。

我想知道是否可以在 googlemock 中执行此操作。

4

3 回答 3

2

这是不可能的。您必须从所有接口重载所有纯虚拟方法(构造函数和析构函数除外)。

于 2011-03-30T07:45:30.223 回答
2

您必须直接或间接地覆盖您继承的类中已声明为纯虚拟的每个方法。不想全部覆盖它们有两个原因:

  1. 它们太多了,你有更好的事情要做,而不是把它们都看完。
  2. 编译一个全部模拟出来的模拟类太慢并且占用太多内存。

(1) 的修复方法是使用gmock_gen.pyGoogle Mockscripts目录中的脚本。它遍历类定义并将方法声明转换为MOCK_METHOD语句。如果 (2) 有问题,可以MOCK_METHOD用存根替换不必要的语句:

MOCK_METHOD1(f, bool(int i));

virtual bool f(int i) {
  thrown std::exception("The stub for f(int) has been invoked unexpectedly.");
}

抛出异常将提醒您注意已调用特定存根的情况,这意味着您可能需要改为模拟它。

编辑:如果模拟的原始接口是使用 Microsoft 的宏编写的,那么这个线程会发布一个脚本,将它们转换为gmock_gen.py.

于 2011-04-01T22:42:08.767 回答
0

我不完全确定是否所有方法都应该包含在模拟类中......在 gmock 示例中,您可以看到例如析构函数没有被模拟。因此,我认为没有必要模拟整个班级。

无论如何,您不应该创建模拟类而不是模拟结构吗?

但是,脚本/生成器中有一个 gmock_gen.py 工具,它应该为您完成模拟大型类的艰苦工作。

于 2011-03-30T06:23:41.627 回答