如何使用谷歌模拟在C++中模拟继承链

use*_*626 5 c++ tdd mocking gmock

我正在使用谷歌模拟,并希望模拟这样的继承链:

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

class C : public B
{
   // virtual method C1();
}
Run Code Online (Sandbox Code Playgroud)

当模拟A时,我需要模拟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()  
}
Run Code Online (Sandbox Code Playgroud)

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

一种方法是要求从C和mockB继承mockC,但是它需要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();
}
Run Code Online (Sandbox Code Playgroud)

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

Meg*_*ozg 3

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

class MockC : public C {
   // mockA1()
   // mockB1() 
   // mockC1()  
}
Run Code Online (Sandbox Code Playgroud)

然后将其传递给您需要测试的所有依赖于ABC的类。这看起来并不不合逻辑。