1. Введение в Mock
Mock — это распространенный метод модульного тестирования. Обычно он используется для имитации реализации класса инструмента или стороннего интерфейса. Тестовый код, написанный на основе Mock, может работать независимо и не должен полагаться на конкретную реализацию классов инструментов или сторонних интерфейсов.
2. Имитированные сценарии использования
Когда функция интерфейса, от которой зависит проект, не разработана, чтобы не блокировать ход разработки, вы можете использовать Mock для имитации функции этой функции интерфейса.
3. Введение в gmock
Полное название gmock — Google Mock, инструмент тестирования C++, запущенный Google в 2008 году. gmock — это платформа для написания и использования классов моделирования C++. gmock сначала поддерживался независимо, а затем был интегрирован в gtest (GoogleTest) и стал подмодулем gtest. После установки gtest вы можете начать использовать gmock.
gmock позволяет быстро и легко определять макеты объектов, которые предоставляют тот же интерфейс, что и реальные объекты. gmock позволяет разработчикам определять поведение моделируемых объектов, например, какие методы вызывать, в каком порядке, сколько раз вызывать, какие параметры передавать, какое значение возвращать и т. д.
4. Основные возможности gmock
1. Предоставляет декларативный синтаксис для определения ложного поведения.
2. Поддерживает моделирование любого типа функции или перегруженной функции.
3. Он имеет богатые средства сопоставления для проверки параметров функции.
4. Для описания моделируемого поведения используется интуитивный синтаксис.
5. Как получить gmock
Чтобы получить gmock, вам необходимо скачать и скомпилировать исходный код библиотеки с открытым исходным кодом GoogleTest:
git clone https://github.com/google/googletest
cd googletest
git checkout release-1.12.1 #Переключиться на ветку последней версии
mkdir build
cd build
cmake .. #Начинаем сборку и компиляцию
make
make install #Установить после компиляции
Скомпилируйте результаты и создайте статические библиотеки gtest и gmock:
6. этапы разработки gmock
Перед тестированием:
Определите интерфейс класса, который необходимо смоделировать.
Определите класс Mock и наследуйте класс, над которым нужно издеваться.
Используйте макрос MOCK_METHOD для моделирования виртуальных функций.
Во время тестирования:
Использование пространства имен тестирования
Создайте экземпляр класса Mock и создайте макет объекта.
Установите поведение моделируемого объекта по умолчанию или желаемое поведение (ON_CALL, EXPECT_CALL)
Запустите код и проверьте, работает ли он должным образом.
Примечание. Mock уделяет больше внимания тому, как возвращается зависимый интерфейс, а не конкретной реализации зависимости.
7. Немного синтаксиса gmock
a.Использование макроса MOCK_METHOD:
class MyMock {
public:
MOCK_METHOD(ReturnType, MethodName, (Args...));
MOCK_METHOD(ReturnType, MethodName, (Args...), (Specs...));
};
Первые 3 параметра включают в себя:
Тип возвращаемого значения функции, имя функции, параметры функции.
Четвертый параметр (Specs) — это квалификатор:
const — требуется при переопределении константных методов
переопределить — требуется при переопределении виртуальных методов
noException — необходимо использовать при переопределении метода noException.
б. Определите ожидаемое поведение. Примером является EXPECT_CALL:
EXPECT_CALL(mock_object, method(matcher1, matcher2, ...))
.With(multi_argument_matcher)
.Times(cardinality)
.InSequence(sequences)
.After(expectations)
.WillOnce(action)
.WillRepeatedly(action)
.RetiresOnSaturation();
mock_object: создан объект фиктивного класса.
метод: смоделированная виртуальная функция
Времена (мощность): количество запусков метода.
InSequence(sequences): порядок выполнения методов (приоритет).
WillOnce(action): поведение, которое происходит при однократном вызове метода, например, какое значение возвращает метод при однократном вызове.
WillRepeatedly(action): поведение по умолчанию/повторяющееся поведение.
Пример кода:
using ::testing::Return;
...EXPECT_CALL(turtle, GetX())
.Times(5)
.WillOnce(Return(100))
.WillOnce(Return(150))
.WillRepeatedly(Return(200));
Конкретное значение:
Метод GetX() объекта черепахи будет вызываться пять раз, возвращая 100 в первый раз, 150 во второй раз и 200 каждый раз.
8. Варианты использования gmock
//step.01: Подтвердите класс, который необходимо смоделировать: Foo
class Foo {
public:
virtual ~Foo();
virtual int GetSize() const = 0;
virtual string Describe(const char* name) = 0;
virtual string Describe(int type) = 0;
virtual bool Process(Bar elem, int count) = 0;};
//step.02: На основе Foo создайте макетный класс MockFoo.
#include "gmock/gmock.h"
class MockFoo:public Foo{
public:
MOCK_METHOD(int, GetSize, (), (const, override));
MOCK_METHOD(string, Describe, (const char* name), (override));
MOCK_METHOD(string, Describe, (int type), (override));
MOCK_METHOD(bool, Process, (Bar elem, int count), (override));
};
//step.03: Инициализируйте фиктивные классы, определите ожидаемое поведение и напишите тестовые образцы.
using::testing::Return;
TEST(BarTest, DoesThis) {
MockFoo foo;
EXPECT_CALL(foo, Describe(5))
.Times(3)
.WillRepeatedly(Return("Category 5"));
EXPECT_EQ(MyProductionFunction(&foo), "good");
}
9. Справочная литература:
https://google.github.io/googletest/
https://google.github.io/googletest/gmock_for_dummies.html
https://google.github.io/googletest/gmock_cheat_sheet.html