Как сгенерировать издевательский объект, созданный в тестируемом классе?

У меня есть класс тестирования, который создает экземпляр класса, над которым я хочу издеваться. Возможно ли это в рамках gmock? Из того, что я прочитал, кажется, что издевательский объект должен быть создан и передан тестируемому объекту, а это не то, чего я хочу.

У меня есть это, чтобы я мог внедрить свой издевательский класс в источник, но я застрял в том, как заставить его генерировать соответствующий объект.


person Adrian    schedule 17.09.2015    source источник
comment
Можете ли вы объяснить причину вопроса? Я пытаюсь понять, почему вы хотите издеваться над возвращаемым объектом... В основном ответ прост, вы не можете издеваться над объектом, но мы все здесь, чтобы учиться и помогать друг другу....   -  person Old Fox    schedule 18.09.2015
comment
Если я хочу издеваться над классом, я бы хотел, чтобы мой класс использовался, даже если он создается в классе, который я тестирую. Допустим, это временный объект, созданный, использованный и уничтоженный. Иногда в пределах одной функции, иногда нет. Иногда выпускается экстерьер к классу, иногда нет.   -  person Adrian    schedule 18.09.2015
comment
вы должны издеваться над объектом, только если он выполняет сложную операцию/влияет на внешние ресурсы и т. д. Если ваш случай соответствует одному из случаев, которые я упомянул, то вы, вероятно, нарушаете SRP (если это так, вы должны реорганизовать код). Если объект является объектом PoD, вам вообще не следует издеваться над ним, вместо этого вы можете проверить состояние объекта в конце метода...   -  person Old Fox    schedule 19.09.2015
comment
@OldFox, я просто разрабатываю структуру для добавления тестирования в устаревшее приложение. Моей главной задачей является возможность заменить существующие определения классов, поскольку это устаревшее приложение, которому не нужно было виртуализировать интерфейс зависимого класса. Переключение на такой поздний этап (более 20 лет спустя) потребовало бы слишком много времени. Следует ли это делать или нет, зависит от того, не работает ли это из-за несоответствия типов. Тем не менее, спасибо за информацию. Я посмотрю указанную вами информацию. Спасибо.   -  person Adrian    schedule 21.09.2015


Ответы (1)


Ответ заключается в том, чтобы поместить EXPECT_CALL() в конструктор, используя *this в качестве первого параметра. Конечно, это работает только в том случае, если вы ожидаете, что все время будет одно и то же.

Это станет более сложным, если ожидаемое поведение будет варьироваться от экземпляра к экземпляру, если только каждый экземпляр не использует другой конструктор.

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

person Adrian    schedule 18.09.2015