Вы не указали, является ли это функцией-членом или глобальной. Так как вы хотите издеваться над этим в среде 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
является глобальной функцией, вы можете использовать тот же подход, определяя небольшой интерфейс и назвав его через этот интерфейс в вашем рабочем коде.
1. Что вы пробовали до сих пор? 2. С этой подписью ваша функция будет, если угодно, заполнить ** копию ** данных ', но не' data' самих себя. –