C++ 我可以不模仿C+;中接口中的所有方法吗+;使用Google Mock时
我正在使用GoogleMock1.6RC,并试图模拟一个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
COM界面
。COM接口中有近50个方法,其中一些是从基本接口继承的。当我创建一个从这个接口继承的mockstruct
并且只模拟我正在使用的方法时,我得到了无法实例化抽象类的错误
我想知道是否可以在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.");
}