2012-07-03 105 views
5

我使用谷歌模拟,并想嘲笑继承链是这样的:如何嘲笑继承链在C++与谷歌嘲笑

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

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

当模拟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() 
} 

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

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

// 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(); 
} 

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

+0

那么A和B的所有虚拟方法都是纯虚拟的? – Fraser

+0

Mock可以相互继承(当然,不是循环的),所以你不必重写所有的方法;看看接受的答案:[Mock Inheritance](http://stackoverflow.com/questions/5484906/can-a-mock-class-inherit-from-another-mock-class-in-googlemock) – dwanderson

+0

D'oh ,如果我一直阅读关于第三方代码的结尾,这会有所帮助。对于那个很抱歉! – dwanderson

回答

1

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

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

然后把它传递给你需要测试依赖于一个Ç所有类。这似乎并不合逻辑。