2012-07-03 11 views
5

Ich bin mit Mock google, und will eine Vererbungskette so verhöhnen:Wie Vererbungskette in C++ mit Google modell

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

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

Wenn Mock A, ich brauche A1 zu verspotten(); Wenn Mock B, muss ich beide A1() und B1() verspotten; Wenn ich C vorstelle, muss ich C1(), B1() und A1() vortäuschen.

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

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

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

jedoch für die Klasse C, I kümmert sich nur die neue erweiterte Funktion C1(). Ich wollte nicht all seine Elternmethode verspotten, besonders wenn zu viele Methoden definiert sind. Aber ich kann die MockC-Klasse nicht instanziieren, wenn ich nicht alle Methoden verspottet habe, die von ihren Eltern geerbt wurden. Eine Möglichkeit besteht darin, zu verlangen, dass mokeC sowohl von C als auch von mockB erbt. Allerdings erfordert es sowohl C als auch mockB, das von B. vererbt wird, aber die C-> B-> A-Vererbungskette ist im Code von Drittanbietern definiert, was nicht möglich ist Veränderung.

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

Gibt es eine gute Möglichkeit, dieses Problem zu lösen?

+0

Also sind alle virtuellen Methoden von A und B rein virtuell? – Fraser

+0

Mocks können voneinander (gut, nicht zirkulär) erben, so dass Sie nicht alle Methoden neu schreiben müssten; schau dir die akzeptierte Antwort an: [Mock Inheritance] (http://stackoverflow.com/questions/5484906/can-a-mock-class-inherit-from-another-mock-class-in-googlemock) – dwanderson

+0

D'oh , hilft, wenn ich den ganzen Weg bis zum Ende lese, über den Code von Drittanbietern. Das tut mir leid! – dwanderson

Antwort

1

Erstellen Sie Mock nur zur letzten Klasse in Ihrer Vererbungshierarchie. Dann verwende es in allen Tests, die irgendeine Klasse in der Hierarchie benötigen. Nach Ihrem Beispiel können Sie nur mockC Klasse erstellen:

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

es dann für alle Klassen übergeben Sie das hängt von A oder B oder C testen müssen. Das wäre nicht unlogisch.

Verwandte Themen