2016-12-07 3 views
0

У меня есть некоторый код C++ следующим образом:C++ - Создание Шпиона в блоке тесты

class MyClass 
{ 
public: 
    MyClass(OtherClass *obj) 
    { 
     obj_ = obj; 
    } 
    void myMethod() 
    { 
     // Do something 
     int value = obj_->otherMethod(); 
     // Do something else 
    } 
private: 
    OtherClass *obj_; 
} 

Я хочу, чтобы создать модульный тест для проверки функциональности myMethod(). К сожалению, OtherClass - это внешняя библиотека, и ее методы не объявлены виртуальными (поэтому я не могу наследовать методы и их заглушить в макете). У меня есть некоторый опыт работы с Mockito, где я, возможно, использовал шпиона для этой цели. Но я не могу найти эквивалент в C++.

Я использую раму googletest, и контекст для этого вопроса (если это помогает) находится в ROS, где я на самом деле пытаюсь заглушить tf::TransformListener.

Вопрос 1: Есть ли альтернатива шпионам, которые я, возможно, не знаю и могу использовать в этой ситуации?

Вопрос 2: Если нет, есть быстрый и легкий способ для меня, чтобы перестроить свой код так, что я могу использовать макет?

ответ

1

решаемый, выполнив следующие действия:

class IOtherMethodAdapter 
{ 
public: 
    virtual int otherMethod() = 0; 
} 

class OtherClassOtherMethodAdapter : public IOtherMethodAdapter 
{ 
public: 
    int otherMethod() { return obj_->otherMethod(); } 
private: 
    OtherClass *obj_; 
} 

Теперь я использовать указатель на IOtherMethodAdapter в MyClass вместо OtherClass и для тестирования я просто инициализировать реализацию интерфейса к погасили/фиктивный объект. Если есть другой способ, не стесняйтесь публиковать это решение.