【问题标题】:How to mock inheritance chain in C++ with google mock如何使用 google mock 在 C++ 中模拟继承链
【发布时间】:2012-07-03 04:33:48
【问题描述】:

我正在使用 google mock,并且想像这样模拟继承链:

class A
{
    // virtual method A1();
}
class B : public A
{
    // virtual method B1();
}

class C : public B
{
   // virtual method C1();
}

mock A时,我需要mock A1(); 模拟 B 时,我必须同时模拟 A1() 和 B1();在模拟 C 时,我必须模拟 C1()、B1() 和 A1()。

//Mock Definition
class MockA : public A
{
   // mockA1()
}

class MockB : public B
{
   // mockA1()
   // mockB1()
}

class MockC : public C
{
   // mockA1()
   // mockB1() 
   // mockC1()  
}

但是,对于 C 类,我只关心新的扩展函数 C1()。我不想模拟它的所有父方法,尤其是当定义的方法太多时。但是,如果我没有模拟从其父类继承的所有方法,我将无法实例化 mockC 类。

一种方法是要求mockC从C和mockB继承,但是它要求C和mockB都从B纯继承。但是C->B->A继承链是在第三方代码中定义的,我无法更改.

// I cannot change this to virtual inheritance
class C : public virtual B
{
    //method C1();
}

class mockB : public virtual B
{
    // mthod B1()
}

class mockC: public C, public mockB
{
   // mock method C1();
}

有什么好的方法可以解决这个问题吗?

【问题讨论】:

  • 那么A和B的所有虚方法都是纯虚的?
  • Mocks 可以相互继承(嗯,不是循环的),所以你不必重写所有的方法;查看接受的答案:Mock Inheritance
  • D'oh,如果我一直阅读到最后,关于第三方代码的内容会有所帮助。很抱歉!

标签: c++ mocking tdd gmock


【解决方案1】:

仅为继承层次结构中的最后一个类创建模拟。然后在需要层次结构中任何类的所有测试中使用它。根据您的示例,您只能创建 mockC 类:

class MockC : public C {
   // mockA1()
   // mockB1() 
   // mockC1()  
}

然后将它传递给所有需要测试的类,这些类依赖于 ABC。这似乎不合逻辑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多