当前位置: 首页 > news >正文

【C/C++】Gtest + GMock 简单使用示例

本文主要用于介绍一个完整的 GTest + GMock 使用示例,涵盖了接口定义、Mock 类实现、被测试类、以及单元测试代码,展示了如何使用 GMock 模拟依赖并进行行为验证。


项目结构

gtest_gmock_demo/
├── CMakeLists.txt
├── include/
│   └── database.h
|     └── user_service.h
├── src/
│   └── user_service.cpp
├── test/
│   ├── user_service_test.cpp
│   └── mock_database.h

1. 接口定义:include/database.h

#pragma once
#include <string>class IDatabase {
public:virtual ~IDatabase() = default;virtual bool connect(const std::string& db_uri) = 0;virtual bool save_user(const std::string& username, int age) = 0;
};

2. 业务实现:src/user_service.cpp

// include/user_service.h
#pragma once#include "database.h"class UserService {
public:UserService(IDatabase *db);bool register_user(const std::string& username, int age);private:IDatabase *db_;
};
// src/user_service.cpp
#include "user_service.h"UserService::UserService(IDatabase *db) : db_(db) {}bool UserService::register_user(const std::string& username, int age) {if (db_ == nullptr || username.empty() || age <= 0) {return false;}return db_->save_user(username, age);
}

3. GMock 模拟类:test/mock_database.h

#pragma once
#include "database.h"
#include <gmock/gmock.h>class MockDatabase : public IDatabase {
public:MOCK_METHOD(bool, connect, (const std::string& db_uri), (override));MOCK_METHOD(bool, save_user, (const std::string& username, int age), (override));
};

4. 单元测试:test/user_service_test.cpp

#include "mock_database.h"
#include "user_service.h" 
#include <gtest/gtest.h>TEST(UserServiceTest, RegisterUserSuccess) {MockDatabase mock_db;UserService service(&mock_db);// 设定期望:save_user 被调用一次,参数为 "alice", 30,返回 trueEXPECT_CALL(mock_db, save_user("alice", 30)).Times(1).WillOnce(::testing::Return(true));EXPECT_TRUE(service.register_user("alice", 30));
}TEST(UserServiceTest, RegisterUserFail_EmptyName) {MockDatabase mock_db;UserService service(&mock_db);// 不应调用 save_userEXPECT_CALL(mock_db, save_user(::testing::_, ::testing::_)).Times(0);EXPECT_FALSE(service.register_user("", 25));
}TEST(UserServiceTest, RegisterUserFail_NegativeAge) {MockDatabase mock_db;UserService service(&mock_db);EXPECT_CALL(mock_db, save_user(::testing::_, ::testing::_)).Times(0);EXPECT_FALSE(service.register_user("bob", -10));
}

CMake 配置:CMakeLists.txt

cmake_minimum_required(VERSION 3.14)project(GTestGMockDemo)set(CMAKE_CXX_STANDARD 17)enable_testing()include_directories(include)include(FetchContent)
FetchContent_Declare(googletestURL https://github.com/google/googletest/archive/refs/heads/main.zip
)FetchContent_MakeAvailable(googletest)add_executable(unit_testssrc/user_service.cpptest/user_service_test.cpp
)target_link_libraries(unit_testsGTest::gtestGTest::gmockGTest::gtest_mainpthread
)add_test(NAME AllTests COMMAND unit_tests)

编译和运行测试


mkdir build && cd build
cmake ..
make
./unit_tests

相关知识点

模块说明
IDatabase依赖接口,用于隔离测试
MockDatabaseGMock 自动生成桩代码
UserService被测试的业务逻辑
EXPECT_CALL验证函数是否按预期调用

相关文章:

  • 简说MQTT
  • 【分布式理论】读确认数与写确认数:分布式一致性的核心概念
  • C# 将 Enum枚举转成List,并显示在下拉列表中
  • 如何开发HarmonyOS 5的分布式通信功能?
  • 动态ds-vnp之normal和shortcut两种方式配置案例
  • 【软考高级系统架构论文】论企业应用系统的分层架构风格
  • AWS RDS/Aurora 开启 Database Insights 高级模式全攻略
  • SQL Server基础语句2:表连接与集合操作、子查询与CET、高级查询
  • 【Qt开发】网络运用
  • GitHub OAuth 认证示例
  • Linux - 安装 git(sudo apt-get)
  • Vue 简写形式全解析:清晰记忆指南
  • 《map和set的使用介绍》
  • 八大架构宪法 - 技术使用指导说明文档
  • OBS --- 录像地址
  • Mac Parallels Desktop Kali 2025 代理设置
  • 区块链是什么
  • 学习C++、QT---02(创建第一个C++项目、命名空间的讲解)
  • Transformer:现代自然语言处理的革命性架构
  • Java大厂面试攻略:Spring Boot与微服务架构深度剖析
  • 网络软文推广网站/网络推广工作好吗
  • 网站建设竞标ppt/百度大数据预测平台
  • cms网站模板套用教程/关键词代发排名首页
  • 武汉便宜做网站hlbzx/长春seo
  • 下载app安装/朝阳seo搜索引擎
  • WordPress中文king主题/seo搜索引擎优化课后答案