Как я могу установить параметр, отправленный по ссылке, используя структуру gmock?

Попробую воспроизвести пример...

class Object{
     public:
     Object(){}
     virtual void doSomething(vector<int>& x) {x.push_back(14);}
     virtual int foo(){return 0;} 
};

class ObjectMock : public Object
{
    public:
    MyMock(){}
    ~MyMock(){}
    MOCK_METHOD1(doSomething, void(std::vector<int>&));
    MOCK_METHOD0(foo, int());
};

class MyClass{
    public:
    Object* _obj;
    MyClass(){
        _obj = new Object;
    }
    void func()
    {
        int error = _obj->foo();
        if(error == 0)
        {
           int result;
           _obj->doSomething(result);
           if(result.size())
           {
               //the code where I'm trying to cover 
           }
        }
    }
};    
int main()
{
    //test 
    MyClass *item = new MyClass;
    ObjectMock* mock = new ObjectMock;
    item->obj = mock;
   //test for function foo 
   EXPECT_CALL(*mock, foo).WillOnce(Return(1));
   //this is my problem
   EXPECT_CALL(*mock, doSomething)//. What????
   item->func();
}

Как я могу изменить вывод, как указано выше, имея в виду, что он получен по ссылке? Я хочу, чтобы в этом векторе был хотя бы один элемент.

Я пытался посмотреть в документации от gmock. Все, что я нашел

EXPECT_CALL (mock_object, метод (сопоставители))

.With(multi_argument_matcher) ?

.Times(мощность) ?

.InSequence(последовательности) *

.После(ожидания) *

.WillOnce(действие) *

.WillRepeatedly(действие) ?

.RetiresOnSaturation(); ?


person Ionut Alexandru    schedule 22.05.2020    source источник
comment
Итак, вы хотите определить ожидание EXPECT_CALL(*mock, doSomething), которое будет использоваться, когда вектор (переданный в качестве аргумента doSomething) не пуст?   -  person Michał Walenciak    schedule 26.05.2020


Ответы (1)


Я нахожу этот ответ в документации

vector<int> v{1,2,3};
EXPECT_CALL(*mock, doSomething).WillOnce(SetArgReferee<0>(v));
person Ionut Alexandru    schedule 26.05.2020
comment
Кстати, большинство операторов new в вашем коде не нужны, более того, они являются источником утечек памяти. - person Michał Walenciak; 28.05.2020