Модульное тестирование в C ++: заглушки (не фиктивные)? - PullRequest
9 голосов
/ 15 июня 2011

Просто попадаю в модульное тестирование с C ++.Похоже, мне нужно будет написать несколько классов-заглушек.Я понимаю, что есть разница между издевательствами и окурками.По сути, кажется, что Mocks - это когда вы тестируете что-то, что произошло с объектом (например, проверяете), в то время как Stubs просто облегчают ваш тест.Я думаю, что для насмешек я могу использовать googlemock, но я ничего не вижу в нем для создания заглушек (ala RhinoMocks 'GenerateStub).

Есть ли способ получить автоматически сгенерированные заглушки?Есть ли в googlemock поддержка заглушек?Или мне в значительной степени приходится вручную создавать заглушки для тестирования?

Ответы [ 4 ]

17 голосов
/ 15 июня 2011

Я думаю, что недостающий фрагмент головоломки состоит в том, что вам не нужно устанавливать ожидание для метода, а вместо этого вы можете просто установить возвращаемое значение по умолчанию.

Mocks

Все обсуждения и примеры в " Google Mock for Dummies " посвящены установлению ожиданий. Все говорит об использовании некоторого кода, подобного следующему:

EXPECT_CALL(turtle, PenDown())
      .Times(AtLeast(1));

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

Заглушки

Комментарий ratkok помог мне узнать, как установить значение по умолчанию. Вот как указать возвращаемое значение для смоделированного объекта, но без ожидания:

ON_CALL(foo, Sign(_))
      .WillByDefault(Return(-1));

http://code.google.com/p/googlemock/wiki/CookBook#Setting_the_Default_Actions_for_a_Mock_Method

Похоже, googlemock выдаст предупреждение, если вы вызовете метод, для которого нет EXPECT_CALL. По-видимому, вы можете предотвратить это предупреждение, используя их NiceMock конструкцию или вы можете просто проигнорировать его. Кроме того, кажется, что вы можете избежать предупреждения, используя вместо этого ожидание (что я не уверен, если это хорошая идея для заглушек). Из Google Mock FAQ :

EXPECT_CALL(foo, Bar(_))
    .WillRepeatedly(...);

Я верю, что это именно то, что я пытался выяснить.

Обновление

Я могу подтвердить, что это работает. Я написал модульный тест, используя google test, вместе с googlemock и смог отключить метод для класса с помощью ON_CALL.

3 голосов
/ 15 июня 2011

Единственное различие между Mock и Stub заключается в том, что Mock обеспечивает поведение, в то время как Stub - нет.

Насколько я знаю, mock от Google Mock фактически являются заглушками по умолчанию.Они обеспечивают поведение только в том случае, если вы помещаете утверждения в различные методы.

0 голосов
/ 15 июня 2011

Взгляните на это: stubgen и аналогичное обсуждение здесь .

Этот вопрос может быть также полезным / связанным.

Что касается насмешек Google - мы используем его в моем текущем проекте, чтобы полностью автоматизировать реализацию заглушки. Практически вся база кода заглушки реализована с помощью гугл-макетов.

0 голосов
/ 15 июня 2011

Был покрыт здесь Я считаю

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...