繁体   English   中英

使用googlemock时,我是否可以避免在C ++界面中模拟所有方法

[英]Can I get away with not mocking all methods in an interface in C++ when using googlemock

我正在使用谷歌模拟1.6 RC,我正在尝试模拟COM Interface COM接口中有近50种方法,其中一些方法是从基接口继承的。 当我创建一个继承自此接口的模拟struct并仅模拟我正在使用的方法时,我得到了cannot instantiate abstract class错误。

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

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

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

  1. 它们太多了,你有更好的时间来处理你的所有事情。
  2. 编译一个模拟类,其中所有这些都被模拟出来太慢并且占用了太多内存。

(1)的修复是使用Google Mock scripts目录中的gmock_gen.py脚本。 它遍历类定义并将方法声明转换为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可接受的C ++。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM