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

时间:2011-03-30 05:52:15

标签: c++ unit-testing mocking gmock

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

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

3 个答案:

答案 0 :(得分:2)

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

  1. 它们太多了,你有更好的时间来处理你的所有事情。
  2. 编译一个模拟类,其中所有这些都被模拟出来的速度太慢而且需要太多内存。
  3. (1)的修正是使用Google Mock的gmock_gen.py目录中的scripts脚本。它遍历类定义并将方法声明转换为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的宏编写模拟的原始接口,this thread会发布一个脚本,将它们转换为gmock_gen.py可接受的C ++。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

无论如何,你不应该创建mock类而不是mock struct吗?

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