GoogleTest之Matchers的用法

news2024/11/16 1:38:38

目录

  • 组合匹配
  • Matcher的类型转换
  • 重载函数的匹配
  • 基于参数执行不同的Actions
  • 多个参数作为一个整体匹配
  • 将Matchers作为谓词使用
  • Matcher汇总

组合匹配

组合某些匹配某些值,可以使用以下:

Matcher使用描述
AllOf(m1, m2, …, mn)参数必须匹配m1, … mn
AllOfArray({m0, m1, …, mn}) / AllOfArray(a_container) / AllOfArray(begin, end) / AllOfArray(array) / AllOfArray(array, count)必须要和从初始化列表/STL容器/迭代器/可迭代的数组/C风格数组给定的参数匹配
AnyOf(m1, m2, …, mn)匹配m1到mn中任意的,至少一个
AnyOfArray({m0, m1, …, mn}) / AnyOfArray(a_container) / AnyOfArray(begin, end) / AnyOfArray(array) / AnyOfArray(array, count)用法同上,匹配任意一个就可以
Not(m)不匹配m就可以
Conditional(cond, m1, m2)如果cond为true则匹配m1,否则匹配m2

示例:

using ::testing::AllOf;
using ::testing::Gt;
using ::testing::HasSubstr;
using ::testing::Ne;
using ::testing::Not;
...
  // The argument must be > 5 and != 10.
  EXPECT_CALL(foo, DoThis(AllOf(Gt(5),Ne(10))));

  // The first argument must not contain sub-string "blah".
  EXPECT_CALL(foo, DoThat(Not(HasSubstr("blah")),NULL));

Matcher的类型转换

  • TODO gMock提供函数 SafeMatcherCast<T>(m) 能够将m转换为Matcher<T>

重载函数的匹配

  1. 通过Const()区分重载的const和非const函数
using ::testing::ReturnRef;

class MockFoo : public Foo {
  ...
  MOCK_METHOD(Bar&, GetBar, (), (override));
  MOCK_METHOD(const Bar&, GetBar, (), (const, override));
};
...
  MockFoo foo;
  Bar bar1, bar2;
  EXPECT_CALL(foo, GetBar()).WillOnce(ReturnRef(bar1));        // The non-const GetBar().
      
  EXPECT_CALL(Const(foo), GetBar()).WillOnce(ReturnRef(bar2));  // The const GetBar().
  // 对foo的调用都使用:Const(foo), 如:
  EXPECT_EQ(Const(foo).GetBar(), bar2);
  1. 区分相同参数个数但不同参数类型,需要指定准确类型。
    第一种方式是使用Matcher<type>() TODO 
    第二种方法:使用TypedEq<type>, An<type>()
using ::testing::An;
using ::testing::Matcher;
using ::testing::TypedEq;

class MockPrinter : public Printer {
 public:
  MOCK_METHOD(void, Print, (int n), (override));
  MOCK_METHOD(void, Print, (char c), (override));
};

TEST(PrinterTest, Print) {
  MockPrinter printer;

  EXPECT_CALL(printer, Print(An<int>()));            // void Print(int);
  EXPECT_CALL(printer, Print(Matcher<int>(Lt(5))));  // void Print(int);
  EXPECT_CALL(printer, Print(TypedEq<char>('a')));   // void Print(char);

  printer.Print(3);
  printer.Print(6);
  printer.Print('a');
}

基于参数执行不同的Actions

可以通过不同期望指定不同参数的Actions
示例代码:

TEST(test_matcher, mock_matcher01) {
  MockMatchFoo foo;
  EXPECT_CALL(foo, DoThis(_)).WillRepeatedly(Return(10));
  EXPECT_CALL(foo, DoThis(Lt(5))).WillRepeatedly(Return(20));

  EXPECT_EQ(foo.DoThis(2), 21);  // 参数值<5,会执行返回20的Action
  EXPECT_EQ(foo.DoThis(6), 12);  // 参数值>5,会调用参数为"_"的Acton
}

输出:
在这里插入图片描述

多个参数作为一个整体匹配

EXPECT_CALL的With方法可以让我们将所有参数作为一个整体来匹配。With的参数必须是Matcher<std::tuple<A1, ..., An>>(A1, … An是函数参数)

EXPECT_CALL(foo, InRange(Ne(0), _)).With(Lt());  // 第一个参数必须小于第二个参数,等价于:
EXPECT_CALL(foo, InRange(Ne(0), _)).With(AllArgs(Lt()));  // 但是这样更具有可读性

可以使用 Args<k1, …, kn>(m) 匹配n个参数

EXPECT_CALL(foo, Blah).With(AllOf(Args<0, 1>(Lt()), Args<1, 2>(Lt()))); // 第0个小于第1个,第1个小于第2个

gMock将n个参数作为一个std::tuple类型,所以如果是谓词的话需要声明成std::tuple类型。

将Matchers作为谓词使用

MatcherDescription
Matches(m)(value)
ExplainMatchResult(m, value, result_listener)
Value(value, m)如果value和m匹配则为true

Matcher汇总

MatcherDescription
_可以是正确类型的任意值
A<type>()An<type>()类型type的任意值

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

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

相关文章

大数据:spark内核调度,DAG,job,宽窄依赖,stage阶段,内存计算管道,并行度task数量

大数据&#xff1a;spark内核调度 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle&#xff0c;尤其s…

【测试开发】实训记录日志

软件测试系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 了解测试开发和软件测试 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 …

建模杂谈系列226 流程与对象

说明 鲁迅说&#xff1a;我家门前门前有两棵树&#xff0c;一棵是枣树&#xff0c;另一棵也是枣树。 从编程语言的角度&#xff0c;可以分为两大类&#xff08;面向过程或面向对象&#xff09;&#xff0c;可以参考这篇文章 文章的内容其实不多&#xff0c;我贴一下&#xff1…

spark入门 YARN模式(六)

一、背景 独立部署&#xff08;Standalone&#xff09;模式由 Spark 自身提供计算资源&#xff0c;无需其他框架提供资源。这 种方式降低了和其他第三方资源框架的耦合性&#xff0c;独立性非常强。但是你也要记住&#xff0c;Spark 主 要是计算框架&#xff0c;而不是资源调度…

CATIA软件各版本区别

之前有个朋友问catia v5r21和catia v5-6r 2011&#xff0c;有什么区别&#xff0c;是一样的吗&#xff1f; 众联亿诚才发现&#xff0c;很多朋友似乎看不懂CATIA各种版本各种型号&#xff0c;那么今天&#xff0c;众联亿诚就来详细解释一下&#xff0c;希望能帮助朋友们解答心…

苹果电脑磁盘诊断工具 SMART Utility for mac

SMART Utility for mac是一款Mac上磁盘诊断工具&#xff0c;能够自动检测磁盘的状态和错误情况&#xff0c;分析并提供错误报告,以直观的界面让用户可明确地知道自己的磁盘状况。SMART Utilitymac版支持普通硬盘HDD和固态硬盘SSD&#xff0c;能够显示出详细的磁盘信息&#xff…

版权中心改革之后,软著办理需要多少钱?

版权中心改革之后&#xff0c;软著办理需要多少钱&#xff1f; 众所周知版权中心2年改了3次&#xff0c;每次改革官费都会涨&#xff0c;最近一次是在4月份&#xff0c;官费涨了近一倍。 其实费用涨了还不算最坏的情况&#xff0c;主要是每次改革办理软著的难度都会增加很多。…

(antD)vue项目使用图标

(antD)vue项目使用图标 效果&#xff1a; <a-icon type"arrow-left" class"backBtn" v-if"cardDiv" click"backBtn" />.backBtn {color&#xff1a;#ccc;font-size: 20px;//图标大小 }

程序员爬虫Scrapy框架知识学习

Scrapy是一个Python编写的高级网络爬虫框架&#xff0c;它可以帮助开发者快速、高效地从网站上获取数据。以下是学习Scrapy框架的一些步骤和建议&#xff1a; 学习Python基础知识&#xff1a;Scrapy是用Python编写的&#xff0c;因此需要掌握Python的基础知识&#xff0c;包括语…

利用彩虹线课程中的知识来制作精美的渐变色块和彩虹字

彩虹字 像这样的效果,同样我们可以使用“渐变色”的技巧。来看下面如何操作 选中字体,然后鼠标右键选”设置型状格式“ 选择“渐变” 有两处决定了彩虹字的样式。 拖动的箭头,这个箭头代表“每一个段”显示的色彩,如我DEMO中的字体是“两段颜色”-蓝+黄组合出来的;角度,…

在本地环境搭建GPT项目

先看效果: 在本地环境搭建gpt项目 1.简介 忽略不能写 2.准备环境 Docker的介绍和安装 Docker是一个开源的容器化平台,它可以帮助开发者和运维人员轻松地构建、打包和部署应用程序。使用Docker,您可以将应用程序及其所有依赖项打包到一个称为容器的独立单元中,使其可…

创新与互动的科技盛宴:探索3DVR元宇宙赛博科技世界虚拟展

导语&#xff1a; 在现代科技迅猛发展的时代&#xff0c;3DVR元宇宙虚拟展厅为我们带来了一场前所未有的科技盛宴。特别是在赛博科技领域&#xff0c;它展现了一系列令人惊叹的优势、优点和实质性的作用&#xff0c;为客户带来了非凡的体验和无限的可能。 一&#xff0e;创新科…

在windows上用gpu训练paddleocr模型所有遇到的坑与解决办法

这里写自定义目录标题 1.首先拉取paddleocr源代码下载预训练模型2.开始训练更改yml配置文件 3.遇到的报错1.ModuleNotFoundError: No module named Polygon2.最难解决的No module named lanms3.ImportError: cannot import name _print_arguments from paddle.distributed.util…

利用scikit-plot可视化机器学习模型!

关注“Python专栏”微信公众号&#xff0c;回复暗号【面试大全】&#xff0c;立即领取面试题简历模板。 scikit-learn (sklearn)是Python环境下常见的机器学习库&#xff0c;包含了常见的分类、回归和聚类算法。在训练模型之后&#xff0c;常见的操作是对模型进行可视化&#…

这么坑?3年经验我要25K,结果只给15K····

2023找到一份满意的工作实在是太难了呀&#xff0c;面试了十几家公司&#xff0c;没有一个满意的offer 我的情况 大概介绍一下个人情况&#xff0c;女&#xff0c;本科&#xff0c;三年多测试工作经验&#xff0c;懂python&#xff0c;会写脚本&#xff0c;会selenium&#xf…

北漂5年终上岸,年薪40W并非遥不可及····

关于我&#xff0c;普通二本&#xff0c;非计算机专业&#xff0c;培训出身&#xff0c;北漂&#xff0c;五年多的工作经验&#xff0c;做过外包&#xff0c;中间有过频繁的跳槽经历&#xff0c;手工点点点为主&#xff0c;最近确认了新Offer&#xff0c;远程办公&#xff0c;涨…

C++ Release版软件 程序运行丢失MSVCR120D.dll的解决方法

软件在Debug模式下运行时正常的&#xff0c;但是切换到Release模式下就弹出错误提示&#xff1a;无法启动此程序&#xff0c;因为计算机中丢失MSVCR120D.dll。尝试重新安装该程序以解决此问题。 解决方法如下&#xff1a; 1、项目“属性”---->配置给为“Release”版本----&…

Python数据分析——教育平台的线上课程智能推荐策略(2020泰迪杯数据分析技能赛)

赛题背景&#xff1a;近年来&#xff0c;随着互联网与通信技术的高速发展&#xff0c;学习资源的建设与共享呈现出新的发展趋势&#xff0c;各种网课、慕课、直播课等层出不穷&#xff0c;各种在线教育平台和学习 应用纷纷涌现。尤其是 2020 年春季学期&#xff0c;受新冠疫情影…

SciencePub学术 | 网络通信类重点SCIEI征稿中

SciencePub学术 刊源推荐: 网络通信类重点SCI&EI征稿中&#xff01;稳定检索56年&#xff01;信息如下&#xff0c;录满为止&#xff1a; 一、期刊概况&#xff1a; 网络通信类重点SCI&EI 【期刊简介】IF&#xff1a;1.0-1.5&#xff0c;JCR4区&#xff0c;中科院4区…

metasploit-framework(msf)——学习与实践

MSF是Metasploit Framework的缩写&#xff0c;是一款广泛使用的渗透测试工具&#xff0c;具有强大的攻击功能。它提供了一个模块化的平台&#xff0c;通过将各种攻击载荷、漏洞利用和辅助工具组装在一起&#xff0c;可用于模拟各种攻击&#xff0c;测试系统安全性&#xff0c;也…