0Pricing
C++ Academy · Урок

Имитация с 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 — локальная установка не требуется.

Все уроки этого курса

  1. Настройка GTest
  2. Проверки и сопоставители
  3. Фикстуры и настройка
  4. Имитация с GMock
← Назад к C++ Academy