玩转单元测试之gmock

引言

前文我们学习了gtest相关的使用,单靠gtest,有些场景仍然无法进行测试,因此就诞生了gmock。

gmock快速入门

在引入gtest时,gmock也同样引入了,因此只需要在编译时加上合适的编译选项即可,注意不同版本的gtest在使用上可能会有所不同,当前为v1.10版本。

1. 待测试文件

#ifndef __HELLO_H__
#define __HELLO_H__#include <iostream>
#include <string>class Tigger{
public:Tigger(){}virtual ~Tigger() {}virtual bool eat(const std::string& food){if (food == "meat") {return true;}return false;}
};
class FeedTigger {
public:Tigger* _tigger;FeedTigger(Tigger* tigger){_tigger = tigger;}bool feed(const std::string& food){if (_tigger !=NULL && _tigger->eat(food)) {return true;}return false;}
};
#endif

2. 单测文件

#include "hello.h"
#include "gtest/gtest.h"
#include "gmock/gmock.h"using namespace ::testing;namespace {class MockTigger : public Tigger {
public:MOCK_METHOD1(eat, bool(const std::string&));
};
TEST(TestTigger, CaseEat) 
{Tigger tigger;FeedTigger feed_tigger0(&tigger);EXPECT_FALSE(feed_tigger0.feed("grass"));MockTigger mock_tigger;FeedTigger feed_tigger1(&mock_tigger);ON_CALL(mock_tigger, eat(_)).Times(1).WillRepeatedly(::testing::Return(0));EXPECT_TRUE(feed_tigger1.feed("grass"));
}
}

可以看到,第一次在传入"grass"这个参数时,程序必定返回false,而第二次,我们使用了mock之后的结果,也就是说无论传入什么参数,返回的结果都会是true。

3. makefile文件

CXX = g++
CXXFLAGS = -Wall
LIBES = -lgtest -lgmock -lgtest_main -lpthread
LPATH = -L/tools/googletest/1.11.0/build/lib  # 替换成自己lib路径
HPATH = -I/tools/googletest/1.11.0/googletest/include/ # 替换成自己的
include路径
HPATH += -I/tools/googletest/1.11.0/googlemock/include/ # 替换成自己的
include路径UTEST_OBJD = hello_unit_testhello_unit_test:hello_unit_test.cpp${CXX} -o $@ $+ -I ../ ${HPATH} ${CXXFLAGS} ${LIBES} ${LPATH}clean:rm -rf *_unit_test

gmock常用宏

1. MOCK_METHODx

其中x表示参数个数,如:

MOCK_METHOD0(func1, void());
MOCK_METHOD1(func2, int(int));
MOCK_METHOD2(func3, int(int, int));

第一个参数,funcx表示函数名,第二个参数为函数返回值和参数列表。若是mock一个模板类的成员函数,只需要使用MOCK_METHODx_T即可。

2. ON_CALL

ON_CALL(mock, func3(_, 1)).Times(4).WillOnce(Return(0)).WillOnce(Return(1)).WillRepeatedly(Return(2));
  • func3中的参数:
    • ‘_’表示匹配任意参数
    • 1,表示匹配指定参数,即参数为1时,才能匹配,否则不会调用mock方法
  • Times,表示mock方法执行多少次
  • WillOnce,指定一次返回结果
  • WillRepeatedly,指定每次返回同样的结果
  • 上述指定mock结果之后,程序会在第一次调用func2方法时返回0,第二次返回1,第三次和第四次都返回2,第五次及之后返回真实结果。
  • 以上为基本用法,更多好玩的用法请参考官方文档

3. EXPECT_CALL

EXPECT_CALL宏在使用上与ON_CALL宏区别不大,可以参照其进行使用,主要区别在于EXPECT_CALL宏在指定调用次数(Times)后,如指定了调用3次,程序必须调用被mock的函数,使得mock结果生效3次,否则就会报测试失败或异常,而ON_CALL则不会。所以当确实需要mock结果生效指定次数时,那么就选择使用EXPECT_CALL。

总结

  • 本篇主要讲解了如何快速入门gmock以及基本语法。
  • gmock原理其实就是利用了多态的特性,通过继承需要被mock的类,然后重写其虚函数,在使用时,将被mock的对象替换成mock后的对象,这样在运行时就可以调用mock后的对象方法,从而达到测试预期。
  • 因此gmock本身只能mock虚函数,而对于non-virtual函数,如非虚成员函数、静态成员函数、全局函数、外部依赖库的函数等,该如何进行mock呢?我们将在下一篇章来介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/48174.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法通关村十一关 | 位运算实现加法和乘法

1.位实现加法和乘法 在计算机中&#xff0c;位运算的效率要比加减乘除的效率更高&#xff0c;因此在高性能软件中源码中大量使用&#xff0c;计算机里各种运算基本上都是位运算。 学习下面内容之前建议先学习位运算规则&#xff1a;算法通关村十一关 | 位运算的规则_我爱学算…

【MaxKey对接一】对接gitlab的oauth登录

MaxKey的Oauth过程 引导进入 GET http://{{maxKey_host}}/sign/authz/oauth/v20/authorize?client_idYOUR_CLIENT_ID&response_typecode&redirect_uriYOUR_REGISTERED_REDIRECT_URI 登录后回调地址 YOUR_REGISTERED_REDIRECT_URI/?code{{code}} 换取Access Token GET…

winform使用usercontrol 构建了一个复杂的列表,列表速度慢该如何优化?

当使用 WinForms 构建复杂的列表时&#xff0c;可能会面临性能问题&#xff0c;特别是在数据量大或 UI 复杂的情况下。以下是一些优化策略&#xff0c;可以帮助您改善列表的性能&#xff1a; 1. **虚拟模式 (Virtual Mode)**&#xff1a;对于大型数据集&#xff0c;考虑使用虚…

「UG/NX」Block UI 曲线收集器CurveCollector

✨博客主页何曾参静谧的博客📌文章专栏「UG/NX」BlockUI集合📚全部专栏「UG/NX」NX二次开发「UG/NX」BlockUI集合「VS」Visual Studio「QT」QT5程序设计「C/C+&#

docker 01(初识docker)

一、docker概念 Docker是一个开源的应用容器引擎&#xff1b;诞生于2013年初&#xff0c;基于Go 语言实现&#xff0c;dotCloud公司出品(后改名为Dockerlnc);Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的Linux …

网络安全设备篇——加密机

加密机是一种专门用于数据加密和解密的网络安全设备。它通过使用密码学算法对数据进行加密&#xff0c;从而保护数据的机密性和完整性。加密机通常被用于保护敏感数据&#xff0c;如金融信息、个人身份信息等。 加密机的主要功能包括&#xff1a; 数据加密&#xff1a;加密机使…

探究Java spring中jdk代理和cglib代理!

面对新鲜事物&#xff0c;我们要先了解在去探索事物的本质-默 目录 一.介绍二者代理模式 1.1.Jdk代理模式 1.2cglib代理模式 1.3二者区别 1.3.1有无接口 1.3.2灵活性 1.4对于两种代理模式的总结 1.4.1jdk代理模式 1.4.2cglib代理模式 二.两种代理模式应用场景 2.1jd…

数学建模-多元线性回归笔记

数学建模笔记 1.学模型✅ 2.看专题论文并复习算法 多元线性回归 无偏性&#xff1a;预测值与真实值非常接近一致性&#xff1a;样本量无限增大&#xff0c;收敛于待估计参数的真值如何做&#xff1a;控制核心解释变量和u不相关 四类模型回归系数的解释 截距项不用考虑一元线性…

搜狗拼音占用了VSCode及微信小程序开发者工具快捷键Ctrl + Shit + K 搜狗拼音截图快捷键

修改搜狗拼音的快捷键 右键--更多设置--属性设置--按键--系统功能快捷键--系统功能快捷键设置--取消Ctrl Shit K的勾选--勾选截屏并设置为Ctrl Shit A 微信开发者工具设置快捷键 右键--Command Palette--删除行 微信开发者工具快捷键 删除行&#xff1a;Ctrl Shit K 或…

【开源项目】Stream-Query的入门使用和原理分析

前言 无意间发现了一个有趣的项目&#xff0c;Stream-Query。了解了一下其基本的功能&#xff0c;可以帮助开发者省去Mapper的编写。在开发中&#xff0c;我们会编写entity和mapper来完成业务代码&#xff0c;但是Stream-Query可以省去mapper&#xff0c;只写entity。 快速入…

CSDN编程题-每日一练(2023-08-22)

CSDN编程题-每日一练(2023-08-22) 一、题目名称:最长递增区间二、题目名称:K树三、题目名称:小Q的价值无向图一、题目名称:最长递增区间 时间限制:1000ms内存限制:256M 题目描述: 给一个无序数组,求最长递增的区间长度。如:[5,2,3,8,1,9] 最长区间 2,3,8 长度为 3。…

分布式事务理论基础

今天啊&#xff0c;本片博客我们一起来学习一下微服务中的一个重点和难点知识&#xff1a;分布式事务。 我们会基于Seata 这个框架来学习。 1、分布式事务问题 事务&#xff0c;我们应该比较了解&#xff0c;我们知道所有的事务&#xff0c;都必须要满足ACID的原则。也就是 …

Hadoop集群搭建(hadoop-3.3.5)

一、修改服务器配置文件 1、配置环境变量 vim /etc/profile #java环境变量 export JAVA_HOME/usr/local/jdk/jdk8 export JRE_HOME$JAVA_HOME/jre export CLASSPATH$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH export PATH$JAVA_HOME/bin:$JRE_HOME/bin:$PATH #hadoop环境变量 …

c++关键字 =delete和=default

在C的类中&#xff0c;有四类特殊的成员函数&#xff1a;① 默认构造函数&#xff1b;② 拷贝构造函数&#xff1b;③ 拷贝赋值函数&#xff08;operator&#xff09;&#xff1b;④ 析构函数&#xff1b;它们控制着类的实例的创建、初始化、拷贝以及销毁。 &#xff08;1&…

前端开发怎么解决前端安全性的问题? - 易智编译EaseEditing

前端安全性是保护前端应用程序免受恶意攻击和数据泄露的重要方面。以下是一些解决前端安全性问题的关键方法&#xff1a; 输入验证与过滤&#xff1a; 对所有用户输入进行验证和过滤&#xff0c;防止恶意用户通过注入攻击等手段破坏应用程序或获取敏感信息。 跨站点脚本&#…

[.NET/WPF] CommunityToolkit.Mvvm 异步指令

我们在开发中, 经常会有这样的需求: 点击按钮后, 进行一些耗时的工作工作进行时, 按钮不可再次被点击工作进行时, 会显示进度条, 或者 “加载中” 的动画 RelayCommand CommunityToolkit.Mvvm 中的 RelayCommand 除了支持最简单的同步方法, 还支持以 Task 作为返回值的异步方…

【接口不对外暴露-过滤器】业务开发,接口不能对外暴露的3种实现方案

一、内外网接口微服务隔离 将对外暴露的接口和对内暴露的接口分别放到两个微服务上&#xff0c;一个服务里所有的接口均对外暴露&#xff0c;另一个服务的接口只能内网服务间调用。 需要额外编写一个只对内部暴露接口的微服务&#xff0c;将所有只能对内暴露的业务接口聚合到…

【数据结构入门指南】二叉树

【数据结构入门指南】二叉树 一、二叉树的概念二、现实中的二叉树三、特殊的二叉树四、二叉树的性质五、二叉树的存储结构5.1 顺序结构5.2 链式结构 一、二叉树的概念 二叉树是一棵特殊的树。一棵二叉树是结点的一个有限集合&#xff0c;该节点&#xff1a; ①&#xff1a;或者…

Spring Boot实现IP地址解析

一、本地解析 如果使用本地ip解析的话&#xff0c;我们将会借助ip2region&#xff0c;该项目维护了一份较为详细的本地ip地址对应表&#xff0c;如果为了离线环境的使用&#xff0c;需要导入该项目依赖&#xff0c;并指定版本&#xff0c;不同版本的方法可能存在差异。 <d…

SpringBoot整合Quartz,实现数据库方式执行定时任务

springboot整合quartz&#xff0c;实现数据库方式执行定时任务。把定时任务信息存进数据库&#xff0c;项目启动后自动执行定时任务。 1.引入依赖包&#xff1a; <dependency> <groupId>org.springframework.boot</groupId> <ar…