2015-07-24 3 views
0

Учитывая 2 классов, как показано ниже:Как издеваются звонок в базовый класс с gmock

class Base 
{ 
public: 
    virtual void doSmt(void); 
} 

class Derived : public Base 
{ 
    void doSmt(void) { Base::doSmt(); } 
} 

Класс Мне нужно, чтобы проверить это Derived. Но я не хочу углубляться в Base, я просто хочу, чтобы проверить, что вызов базы называется внутри doSmt()

Что-то вроде этого:

TEST_F(Derived, DoSmt) 
{ 
    EXPECT_CALL(Base, doSmt()).Times(1); 
    testedInstance.doSmt(); 
} 

Потому что у меня уже есть тест для базы, и База была унаследована двумя классами.

Есть ли способ?

ответ

1

Мне назначили писать unittest для «злого» дизайна рядом с gmock. С самого начала это сложнее, чем я, но у меня также есть свое решение для этого.

Это проще, чем я, хотя (опять же: D)

1.Insert в заголовок базового класса необходимо любой макет. Или вы можете создать новый и указать его путь.

class Base 
{ 
public: 
    MOCK_METHOD0(mock_doSmt, void()); 
    void doSmt(void); 
} 

2.Дль звонки в Базируйте макет метод, просто создать BaseStub.cpp

Этого источник цель для насмешливых только. Так что, вы должны скомпилировать & связь с BaseStub.cpp вместо Base.cpp

void Base::doSmt(void) { mock_doSmt(); } 

3.When тест

EXPECT_CALL(*reinterpret_cast<Base*>(&derivedInstance), mock_doSmt()).Times(1); 

mock_doSmt вместо doSmt

Этот способ может решить Singleton слишком , Создайте SingletonStub, как указано выше, и в SetUp() просто singletonInstance = Singleton::getInstance();

Помните: Таким образом, у вас есть 2 источника и 2 заголовка.

Когда сталкиваются с этой дурой, я понял, что должен использовать #include <...> вместо #include "..."

Причина, когда вы задаете включают Дира, #include <...> позволит вам больше контроля.

И еще важно, чтобы я хотел бы поделиться является

Не абстрактные так много вашего ООП.Потому что после этого он (или ваш коллега) повлечет за собой большие неприятности. Не наследуйте более 2 уровней, всего 1 интерфейс и 1 наследуйте.

0

Как написано, нет прямого пути, чтобы высмеять явный вызов Base::doSmt(). Трудно сделать вызов, не зная контекста того, как используется класс Base, но я предполагаю, что вам лучше будет использовать композицию вместо наследования для повторного использования функциональных возможностей, предоставляемых Base. Это значительно облегчило бы тестирование классов в зависимости от Base, так как вы могли просто ввести класс Base в Derived и убедиться, что Base называется соответствующим образом.

Смежные вопросы