Имитация с GMock
Имитируйте зависимости
«Имитация с GMock» — бесплатный урок C++ Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
Зачем нужны имитации?
GMock создаёт поддельные объекты, которые записывают вызовы и возвращают запрограммированные результаты. Имитация изолирует тестируемый компонент от медленных или непредсказуемых зависимостей, таких как базы данных или сети.
Начните с интерфейса
Зависимости, которые можно имитировать, обычно представляют собой абстрактные базовые классы с виртуальными методами.
#include <string>
class Database {
public:
virtual ~Database() = default;
virtual std::string get(int id) = 0;
virtual bool save(const std::string& v) = 0;
};Определение класса-имитации
Используйте MOCK_METHOD, чтобы создать имитацию для каждого виртуального метода, указав возвращаемый тип, имя, аргументы и квалификаторы.
#include <gmock/gmock.h>
#include <string>
class Database {
public:
virtual ~Database() = default;
virtual std::string get(int id) = 0;
};
class MockDatabase : public Database {
public:
MOCK_METHOD(std::string, get, (int id), (override));
};Задание ожиданий
EXPECT_CALL задаёт, как должен вызываться метод имитации и что он должен возвращать. Конструкция WillOnce(Return(...)) задаёт результат.
#include <gmock/gmock.h>
using ::testing::Return;
TEST(DbTest, ReturnsValue) {
MockDatabase db;
EXPECT_CALL(db, get(1)).WillOnce(Return("alice"));
EXPECT_EQ(db.get(1), "alice");
}Сопоставители аргументов
Ожидания могут неточно сопоставлять аргументы с помощью таких сопоставителей, как _ (любой аргумент), Gt(5) или HasSubstr("x").
#include <gmock/gmock.h>
using ::testing::_;
using ::testing::Return;
TEST(DbTest, AnyId) {
MockDatabase db;
EXPECT_CALL(db, get(_)).WillRepeatedly(Return("x"));
EXPECT_EQ(db.get(99), "x");
}Кратность
Укажите с помощью Times, сколько раз должен выполняться вызов.
Times(1)— ровно один разTimes(AtLeast(2))— не менее двух разTimes(0)— вызов не должен выполняться ни разу
#include <gmock/gmock.h>
using ::testing::AtLeast;
using ::testing::Return;
TEST(DbTest, CalledTwice) {
MockDatabase db;
EXPECT_CALL(db, get(1)).Times(AtLeast(2)).WillRepeatedly(Return("v"));
db.get(1);
db.get(1);
}Действия возврата
Действия определяют поведение.
Return(value)ReturnRef(ref)Throw(exception)Invoke(callable)— для выполнения собственного кода
Внедрение имитации
Тестируемый компонент должен принимать зависимость через указатель или ссылку на интерфейс. Это внедрение зависимостей — именно оно делает возможным использование имитаций.
#include <string>
class Database;
class UserService {
Database& db;
public:
UserService(Database& d) : db(d) {}
std::string name(int id);
};Проверка взаимодействий
GMock проверяет все ожидания EXPECT_CALL, когда имитация уничтожается. Невыполненные ожидания (неверное количество вызовов или отсутствие вызовов) автоматически приводят к ошибке теста.
Вежливые, строгие и назойливые имитации
Управляйте обработкой неожиданных вызовов.
NiceMock: игнорирует не представляющие интереса вызовыStrictMock: любой неожиданный вызов приводит к ошибке- По умолчанию (назойливая имитация): предупреждает о не представляющих интереса вызовах
Имитируйте только то, чем владеете
Предпочитайте имитировать собственные интерфейсы, а не конкретные классы сторонних библиотек. Создавайте тонкие интерфейсы-обёртки вокруг внешних библиотек, чтобы тесты оставались стабильными.
Быстрая проверка
Вспомните, когда GMock проверяет ожидания.
Повторение
Вы изучили GMock.
- Имитируйте виртуальные интерфейсы с помощью
MOCK_METHOD EXPECT_CALLи действия задают поведение- Сопоставители и
Timesуправляют аргументами и кратностью - Внедряйте имитации; ожидания проверяются при уничтожении
Часто задаваемые вопросы
Урок «Имитация с GMock» бесплатный?
Да — полный текст урока «Имитация с GMock» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «Имитация с GMock»?
Имитируйте зависимости Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Имитация с GMock»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Настройка GTest
- Проверки и сопоставители
- Фикстуры и настройка
- Имитация с GMock