фиктивный метод с 11 параметрами с помощью gmock

Я использую gmock, чтобы издеваться над моими зависимостями в устаревшем коде. У одного из классов есть метод с 11 параметрами. Когда я попытался использовать MOCK_METHOD11_WITH_CALLTYPE, чтобы издеваться над ним, я обнаружил, что этого макроса не существует. gmock поддерживает только до 10 параметров. Что вы предлагаете для этого? Я реализую этот метод с фиктивным телом? Или скопировать и расширить макрос? Спасибо!

PS, мне не нужно издеваться над этим методом в моих тестах прямо сейчас, но, вероятно, мне нужно будет сделать это в будущем.

С наилучшими пожеланиями,


person Archer    schedule 21.03.2013    source источник


Ответы (3)


Методы с более чем 10 параметрами могут быть признаком проблем. Я могу предложить обходной путь, который поможет в вашем конкретном случае, но который также может быть хорошей идеей, помимо насмешек. Возьмите несколько параметров, которые имеют смысл как группу, и объедините их в структуру. Затем передайте экземпляр этой структуры в качестве аргумента метода. Таким образом, вместо 11 аргументов у вас может быть 3 или 4. Это не только поможет решить проблему с фиктивной библиотекой, но и может улучшить удобство использования вашего класса, поскольку методы с таким количеством аргументов обычно трудно читать в самом начале. сайт вызова.

person John Zwinck    schedule 21.03.2013
comment
Я согласен, что это своего рода запах кода. Я ценю ваше предложение. Но это устаревшая кодовая база, и поскольку этот метод является частью API, я попробую что-нибудь еще. Теперь я переопределяю тривиальную версию. - person Archer; 21.03.2013
comment
Устаревший код не проблема: просто добавьте новый метод, принимающий структуру, оставьте также и старый, и пусть один из них будет вызывать другой. Нет ничего сложного в том, чтобы сделать его обратно совместимым и по-прежнему вмещать ваши тесты. - person John Zwinck; 22.03.2013

Если кому-то нужны дополнительные аргументы gmock, вот расширение только для заголовка: gmock-more-args

person Sergey Podobry    schedule 12.10.2017

Метод, который вы пытаетесь издеваться, является чисто виртуальным. Вот что я сделал, не меняя существующий код:

struct ParamsMoreThanTen
{
  Param_Type param_1;
  Param_Type param_N;
};

MOCK_METHOD1(methodWithMoreThanTenParms, methodReturnType(ParamsMoreThanTen params));

methodReturnType methodWithMoreThanTenParms(
    Param_Type param_1,
    Param_Type param_N) override
{

  return    methodWithMoreThanTenParms(ParamsMoreThanTen
  {
    Param_Type param_1,
    Param_Type param_N
  });

};
person Kanwar Malik    schedule 18.04.2019