C++ 我可以不模仿C+;中接口中的所有方法吗+;使用Google Mock时

C++ 我可以不模仿C+;中接口中的所有方法吗+;使用Google Mock时,c++,unit-testing,mocking,gmock,C++,Unit Testing,Mocking,Gmock,我正在使用GoogleMock1.6RC,并试图模拟一个COM界面。COM接口中有近50个方法,其中一些是从基本接口继承的。当我创建一个从这个接口继承的mockstruct并且只模拟我正在使用的方法时,我得到了无法实例化抽象类的错误 我想知道是否可以在googlemock中实现这一点。我不完全确定mock类是否应该涵盖所有方法。。。在gmock示例中,您可以看到例如析构函数没有被模拟。因此,我认为没有必要嘲笑整个班级 无论如何,您不应该创建模拟类而不是模拟结构吗 但是,在scripts/gene

我正在使用GoogleMock1.6RC,并试图模拟一个
COM界面
。COM接口中有近50个方法,其中一些是从基本接口继承的。当我创建一个从这个接口继承的mock
struct
并且只模拟我正在使用的方法时,我得到了
无法实例化抽象类的错误


我想知道是否可以在googlemock中实现这一点。

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

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


但是,在scripts/generator中有一个gmock_gen.py工具,可以为您模拟大型类。

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

您必须直接或间接重写继承自的类中声明为纯虚拟的每个方法。有两个原因不想将其全部覆盖:

  • 它们太多了,你要做的事情比把它们全部检查一遍要好
  • 编译一个模拟类时,所有这些类都被模拟出来,速度太慢,占用了太多内存
  • (1)的修复方法是在Google Mock的
    scripts
    目录中使用
    gmock\u gen.py
    脚本。它遍历类定义并将方法声明转换为
    MOCK\u方法
    语句。如果对(2)有问题,可以用存根替换不必要的
    MOCK_方法
    语句:

    MOCK_METHOD1(f, bool(int i));
    

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


    <>编辑:如果使用微软的宏编写了模拟界面的原始接口,则有一个脚本将其转换为C++,可以接受<代码> GMOCKYGEN。PY < /C> > < /P>不熟悉谷歌模拟,但通常情况下,这种情况是在适配器类的帮助下处理的。
    析构函数
    不需要显式模拟,因为您的类将有一个默认析构函数。我正在创建一个模拟的
    struct
    ,因为我试图模拟的com接口是一个
    struct
    。我将尝试使用该脚本,看看它是否有助于减少一些工作。我想您可以修改该脚本,使其也适用于结构。但我不知道要做多少工作。无论如何,google mock文档并没有提到模拟结构。模拟类类似于模拟结构()。我不确定修改脚本有多简单,因为我不熟悉PythonAs。最后,我会尝试暂时将struct更改为class,运行脚本,然后将所有“class”关键字更改为“struct”。但这不是一个解决方案。我可以使用继承来创建模拟对象吗。例如,一个抽象类B继承自一个抽象类A,是否可以创建一个继承自MockA的MockB,并且每个mock类都只模拟对应类中的特定纯虚拟方法classes@rtdecl是的,你能做到,但是您只能实例化一个重载了所有纯虚拟方法的方法。我尝试创建了一个
    MockIUnknown
    继承自
    IUnknown
    和一个
    MockIDispatch
    继承自
    IDispatch
    MockIUnknown
    IUnknown
    有3个纯虚拟方法,我在
    MockIUnknown
    中模拟了它们,
    IDispatch
    还有4个纯虚拟方法,我在
    MockIDispatch
    中模拟了它们。我能够创建和实例
    MockIUnknown
    ,但不能创建和实例
    MockIDispatch
    ,我得到“无法实例化抽象类”error@rtdecl真奇怪。您是否检查了MockIDispatch中方法的签名?也许这是错误的。如果看不到代码(或显示问题的最小示例),很难判断是否存在问题。>抛出异常会提醒您某个特定存根已被调用的情况,这意味着您可能需要模拟它。您还可以使用“严格”模拟来检查是否只调用对模拟对象的预期调用:
    virtual bool f(int i) {
      thrown std::exception("The stub for f(int) has been invoked unexpectedly.");
    }