2015-11-02 4 views
0

Я хочу создать макет для этой функции:C++ gmock вызвать другую функцию с теми же аргументами

bool func1(vector<string> data) 

Реальная функция должна заполнить вектор и возвращает истину, если ей это удалось.
Мой макет должен также заполнить вектор значениями и всегда возвращать true. как я могу это сделать с помощью gmock?

+1

1. Что вы пробовали до сих пор? 2. С этой подписью ваша функция будет, если угодно, заполнить ** копию ** данных ', но не' data' самих себя. –

ответ

1

Вы не указали, является ли это функцией-членом или глобальной. Так как вы хотите издеваться над этим в среде C++ mocking, я предполагаю, что это так. Кроме того, как сказал Антонио, если вы хотите изменить вектор, вы должны изменить подпись своей функции и передать data, используя ссылку. Итак, если func1 является членом класса MyClass, вы хотите сделать следующее.

Создайте интерфейс IMyClass и сделать свой класс реализовать этот интерфейс:

class IMyClass 
{ 
public: 
    virtual IMyClass() {} 
    virtual bool func1(vector<string> &data) = 0; 
} 

class MyClass : public IMyClass 
{ 
    bool func1(vector<string> &data) override 
    { 
     // Your code that modifies 'data' 
    } 
} 

Затем сделать макет класс, который также реализует этот интерфейс, используя gmock:

class MyClassMock : public IMyClass 
{ 
public: 
    MOCK_METHOD1(func1, bool(vector<string> &)); 
} 

Наконец, в тестах, вы можете высмеивать вызовы этой функции. Скажем, вы хотите издеваться над вызовом, который установит две строки ("str1", "str2") на вектор data. Это то, что вы могли бы сделать в тесте тела:

vector<string> dummyData = { string("str1"), string("str2") }; 
MyClassMock mockObj; 
EXPECT_CALL(mockObj, func1(_)) 
    .WillOnce(DoAll(SetArgReferee<0>(dummyData), Return(true))); 

Если func1 является глобальной функцией, вы можете использовать тот же подход, определяя небольшой интерфейс и назвав его через этот интерфейс в вашем рабочем коде.

+0

Спасибо, работает !!! – Liad

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