C ++ Единоличное тестирование: заглушки (не насмешки)?
-
28-10-2019 - |
Вопрос
Просто попадает в модульное тестирование с C ++. Похоже, мне нужно будет написать несколько классов заглушек, когда я продолжаю. Насколько я понимаю, есть разница между макетами и заглушками. По сути, кажется, что насмехается, когда вы тестируете что -то, что произошло на объекте (например, проверка), в то время как заглушки просто облегчают ваш тест. Я предполагаю, что для издевательства я могу использовать Googlemock, но я ничего не вижу в нем для создания заглушек (ala rhinomocks 'generatestub).
Есть ли способ получить автоматически сгенерированные заглушки? Есть ли у Googlemock поддержка заглушек? Или мне придется вручную создавать заглушки для тестирования?
Решение
Я думаю, что недостающая часть головоломки заключается в том, что вам не нужно устанавливать ожидания на методе, и вместо этого вы можете просто установить возвращаемое значение по умолчанию.
Издевается
Все обсуждения и примеры в "Google Mock for Dummies"Сфокусируется на настройке ожиданий. Все говорит об использовании некоторого кода, аналогичного следующему:
EXPECT_CALL(turtle, PenDown())
.Times(AtLeast(1));
Это то, что вы хотите издеваться, но для загрязнения у вас нет никаких ожиданий. Прочитав это вступление, я понятия не имел, как использовать Googlemock для загрязнения.
Заглушки
Комментарий Раткока привел меня к тому, чтобы узнать, как установить возвратное значение по умолчанию. Вот как указать возвращаемое значение для высмеиваемого объекта, но не ожидая:
ON_CALL(foo, Sign(_))
.WillByDefault(Return(-1));
http://code.google.com/p/googlemock/wiki/cookbook#setting_the_default_actions_for_a_mock_method
Похоже, что Googlemock выпустит предупреждение, если вы позвоните методу, который не имеет ожидаемого_колла. Видимо вы можете предотвратить это предупреждение, используя их Никмок конструкция или вы можете просто игнорировать это. Кроме того, вы можете избежать предупреждения, используя вместо этого ожидание (что я не уверен, хорошая идея для заглушек). От Google Mock Faq:
EXPECT_CALL(foo, Bar(_))
.WillRepeatedly(...);
Я считаю, что это именно то, что я пытался выяснить.
Обновлять
Я могу подтвердить, что это работает. Я написал модульный тест с использованием Google Test вместе с Googlemock и смог загрязнять метод для класса с использованием on_call.
Другие советы
Единственная разница между макетом и заглушкой заключается в том, что макет применяет поведение, а заглушка - нет.
Насколько мне известно, Mocks Google Mock на самом деле по умолчанию на самом деле загрязнения. Они обеспечивают поведение только в том случае, если вы ставите утверждения о различных методах.
Взгляните на это: Увигатель и аналогичное обсуждение здесь.
Этот вопрос Может быть, также полезно/связано.
Что касается Google Mocks - мы используем его в моем текущем проекте для полной автоматизации реализации STUB. Практически вся база кода Actub реализована с использованием Google Mocks.