单元测试: gmock
Mock,更确切地说应该是Mock Object。当我们在单元测试、模块的接口测试时,当这个模块需要依赖另外一个/几个类,而这时这些类还没有开发好,这时我们就可以定义Mock对象来模拟那些类的行为。
mock工具的其中一个非常重要的作用是指定函数的行为(模拟函数的行为)。可以对入参进行校验,对出参进行设定,还可以指定函数的返回值。
Google's framework for writing and using C++ mock classes on a variety of platforms (Linux, Mac OS X, Windows, Windows CE, Symbian, etc). Inspired by jMock, EasyMock, and Hamcrest, and designed with C++'s specifics in mind, it can help you derive better designs of your system and write better tests.
Google Mock:
provides a declarative syntax for defining mocks,
can easily define partial (hybrid) mocks, which are a cross of real and mock objects,
handles functions of arbitrary types and overloaded functions,
comes with a rich set of matchers for validating function arguments,
uses an intuitive syntax for controlling the behavior of a mock,
does automatic verification of expectations (no record-and-replay needed),
allows arbitrary (partial) ordering constraints on function calls to be expressed,
lets a user extend it by defining new matchers and actions.
does not use exceptions, and
is easy to learn and use.
Google Mock is not a testing framework itself. Instead, it needs a testing framework for writing tests. Google Mock works seamlessly with Google Test, but you can also use it with any C++ testing framework.
参考:
http://coney.github.io/2015/05/mock-static-function-with-mockcpp/
MockCpp手册(中文)
1. 代码 mock_test.cc
#include <gtest/gtest.h>
#include <gmock/gmock.h>using namespace testing;class A {
public:int set(int num) {value = num;return num;}int get() {return value;}int value;
};class MockA : public A {
public:MOCK_METHOD1(set, int(int num));MOCK_METHOD0(get, int());};TEST(Atest, getnum)
{MockA m_A;int a = 10;EXPECT_CALL(m_A, set(_)).WillRepeatedly(Return(a));int k = m_A.set(200);EXPECT_EQ(10, k);
}int main(int argc, char *argv[]) {::testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();
}
2. 编译
g++ mock_test.cc -lgtest -lgmock -lpthread -std=c++11
3. 测试执行
baoli@ubuntu:~/tools/gtest/mytest$ ./a.out
[==========] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
[----------] 1 test from Atest
[ RUN ] Atest.getnum
[ OK ] Atest.getnum (0 ms)
[----------] 1 test from Atest (0 ms total)[----------] Global test environment tear-down
[==========] 1 test from 1 test suite ran. (0 ms total)
[ PASSED ] 1 test.
4. 说明
4.1 MOCK_METHOD
MOCK_METHOD1(set, int(int num)); //调用set方法,一个参数(int num),返回int型
MOCK_METHOD0(get, int()); //调用get方法,无参数,返回int型
4.2 EXPECT_CALL
This means EXPECT_CALL() should be read as expecting that a call will occur in the future, not
that a call has occurred. Why does Google Mock work like that? Well, specifying the expectation
beforehand allows Google Mock to report a violation as soon as it arises, when the context (stack
trace, etc) is still available. This makes debugging much easier
单元测试: gmock相关推荐
- P4使用Ubuntu中安装教程
/*************************************/ 补充,2020年5月11日 13点18分 有同学说网络环境啥的,获取安装包比较困难,我把大概要用的安装包放到百度网盘了, ...
- 代码单元测试工具:gmock
Mock,更确切地说应该是Mock Object.当我们在单元测试.模块的接口测试时,当这个模块需要依赖另外一个/几个类,而这时这些类还没有开发好,这时我们就可以定义Mock对象来模拟那些类的行为. ...
- C++单元测试学习总结9
C++单元测试一:并非看上去那么简单--几个很实际的问题 理想与现实 为Java和C#做单元测试,基本上都有比较统一的工具.模式可用,IDE的支持也非常到位:可是到 了C++这里,一切就变的那样的&q ...
- gmock学习01---Linux配置gmock
本文目的 本文主要介绍gmock 1.6.0版本在Linux上如何部署和使用. gmock是做什么的? 使用C++手动编写mock对象将会是一件十分耗时,易于出错,枯燥乏味的事情.gmock提供一整套 ...
- 效能优化实践:C/C++单元测试万能插桩工具
作者:mannywang,腾讯安全平台后台开发 研发效能是一个涉及面很广的话题,它涵盖了软件交付的整个生命周期,涉及产品.架构.开发.测试.运维,每个环节都可能影响顺畅.高质量地持续有效交付.在腾讯安 ...
- 工程师必备:C/C 单元测试万能插桩工具
研发效能是一个涉及面很广的话题,它涵盖了软件交付的整个生命周期,涉及产品.架构.开发.测试.运维,每个环节都可能影响顺畅.高质量地持续有效交付.在腾讯安全平台部实际研发与测试工作中我们发现,代码插桩隔 ...
- 玩转Google开源C++单元测试框架
玩转Google开源C++单元测试框架Google Test系列(gtest)(总) 前段时间学习和了解了下Google的开源C++单元测试框架Google Test,简称gtest,非常的不错. 我 ...
- 第一章 UT单元测试——GoogleTest通用构建说明
系列文章目录 第一章 UT单元测试--GoogleTest通用构建说明 第二章 UT单元测试--GTest框架实例 文章目录 系列文章目录 前言 GoogleTest通用构建说明 设置 用CMake构 ...
- googletest单元测试框架安装及使用
1.下载googletest 介绍:现在的googletest软件包分两部分,一部分是gtest,单元测试框架,实现对单元测试用例的管理和设计,另一部分是gmock,实现打桩功能,这两个可以结合起来使 ...
最新文章
- 感知机模拟或门的实现:权重和阈值的设置
- MySQL5.6一主多从复制配置方式一:Tungsten复制中间件
- 用 javascript 获取当页面上鼠标(光标)位置
- mongodb用户管理简单记录
- 《A Berkeley View of systems challenges for AI》总结
- 如何在AS/400上发送带有颜色的MESSAGE
- python如何设置字体大小_[Python Basic]如何设置 Python 的运行环境
- 马化腾定义腾讯是普通公司,这波重新定义“普通”可还行......
- HandlerAdapter解析参数过程之HandlerMethodArgumentResolver
- Qt4_子类化QTableWidgetItem
- Laravel5.x 封装的上传图片类
- 安卓蓝牙BluetoothBLE开发JDY-10M
- 安装spinningup填坑ERROR: Could not build wheels for mpi4py which use PEP 517
- elasticsearch删除过期数据
- 计算机职场礼仪与技巧论文,职场礼仪论文1500字.doc
- 机器视觉——相机选型
- 物联网操作系统HelloX V1.82发布公告
- 前端入门篇(八)表单
- C#之父牛逼还是Java之父牛逼?
- 树莓派调用as608指纹模块,实现指纹识别功能
热门文章
- webpack指南-webpack入门-webpack的安装
- HTML常见标签总结
- PowerDesigner的使用二
- php 当我添加数据成功后跳到首页 为什么刷新还会增加数据,使用post提交数据之后,有错误,页面刷新之后,想保持原有值...
- Java源码:java.lang.reflect反射之AccessibleObject、ReflectionFactory、Filed、Method、Constructor类
- 關於BigDecimal的比較
- 童话镇计算机乐谱,童话镇简谱(歌词)-陈一发演唱-桃李醉春风记谱
- android权限 启动失败,Android 6.0打开失败:EACCES(权限被拒绝)
- c++类指针赋值表达式必须是可修改的左值_C++学习刷题8--复制构造函数和赋值运算符重载函数...
- Golang 检查元素在slice中是否存在 模仿Php实现arrary_In