2012-07-03 4 views
5

Я использую Google издеваться, и хочу, чтобы дразнить в цепочку наследования, как это:Как издеваются цепочки наследования в C++ с помощью Google издеваться

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

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

Когда фиктивные А, мне нужно издеваться 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(); 
} 

Есть ли хороший способ решить эту проблему?

+0

Итак, все виртуальные методы A и B являются чисто виртуальными? – Fraser

+0

Мошки могут наследовать друг от друга (ну, а не круговое), поэтому вам не придется переписывать все методы; посмотрите на принятый ответ: [Mock Inheritance] (http://stackoverflow.com/questions/5484906/can-a-mock-class-inherit-from-another-mock-class-in-googlemock) – dwanderson

+0

D'oh , помогает, если я прочитаю весь путь до конца, о стороннем коде. Извини за это! – dwanderson

ответ

1

Создайте mock только для последнего класса в иерархии наследования. Затем используйте его во всех тестах, для которых нужен какой-либо класс в иерархии. По вашему примеру, вы можете создать только класс mockC:

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

Затем передать его всем классам, которые необходимо проверить, что зависит от или B или C. Это не выглядит нелогичным.