Как издеваться над цепочкой наследования в C++ с помощью google mock

Я использую макет Google и хочу издеваться над цепочкой наследования следующим образом:

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, если не имитировал все методы, унаследованные от его родителя.

Один из способов - потребовать, чтобы 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();
}

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


person user1497626    schedule 03.07.2012    source источник
comment
Значит, все виртуальные методы A и B чисто виртуальные?   -  person Fraser    schedule 04.07.2012
comment
Моки могут наследоваться друг от друга (ну, не циклически), так что вам не придется переписывать все методы; посмотрите на принятый ответ на: Mock Inheritance< /а>   -  person dwanderson    schedule 26.02.2016
comment
О, помогает, если я дочитал до конца, о стороннем коде. Извини за это!   -  person dwanderson    schedule 26.02.2016


Ответы (1)


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

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

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

person Megamozg    schedule 14.08.2015