Google Mock启蒙篇matcher详细尽说明

单元测试学习: mock有复杂行为的接口 一, 问题       gmock 提供了EXPECT_CALL的WillOnce 和WillRepeatedly方法来模拟返回值比较简单的情况(可以参考http://www.cppblog.com/woaidongmao/archive/2009/05/02/81669.html),  但是有时需要模拟更复杂的行为. 例如需要 "返回一个有序数列中大于某个值的最小数", 即stl中的l 阅读详情

Google Mock启蒙篇 [2] (Google C++ Mocking Framework for Dummies 翻译)

Setting Expectations

    成功地使用 Mock 对象的关键是在它上面设置合适的期望。如果你设置的期望太过严格,你的测试可能会因为无关的改变而失败。如果你把期望设置的太过松驰, bugs可能会溜过去。而你需要的是你的测试可以刚好捕获你想要捕获的那一种 bug 。Google Mock 提供了一些方法可以让你的测试尺度 刚好 ( just right ) 。

General Syntax

    在 Goolge Mock 中,我们用 EXPECT_CALL() 宏来设置一个 Mock 函数上的期望。一般语法是:

EXPECT_CALL(mock_object, method(matchers)) <xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />

    .Times(cardinality)

    .WillOnce(action)

.WillRepeatedly(action);

这个宏有两个参数:第一个是 Mock 对象,第二个参数是函数和它的参数。注意两个参数是用逗号 ( , ) 分隔的,而不是句号 ( . ) 。

这个宏可以跟一些可选 子句 ,这些子句可以提供关于期望更多的信息。我们将会在下面的小节中介绍每个子句有什么意义。

这些语法设计的一个目的是让它们读起来像是英语。比如你可能会直接猜出下面的代码是有什么含义

using ::testing::Return;...

EXPECT_CALL(turtle, GetX())

    .Times(5)

    .WillOnce(Return(100))

    .WillOnce(Return(150))

.WillRepeatedly(Return(200));

公布答案, turtle 对象的 GetX() 方法会被调用 5 次,它第一次返回 100 ,第二次返回 150 ,然后每次返回 200 。许多人喜欢称这种语法方式为特定领域语言 ( Domain-Specific Language (DSL) ) 。

注意: 为什么我们要用宏来实现呢?有两个原因:第一,它让期望更容易被认出来 (无论是 grep 还是人去阅读 ) ,第二,它允许 Google Mock 可以得到失败期望在源文件的位置,从而使 Debug 更容易。

Matchers: What Arguments Do We Expect?

    当一个 Mock 函数需要带参数时,我们必须指定我们期望的参数的是什么;比如:

// Expects the turtle to move forward by 100 units.

EXPECT_CALL(turtle, Forward(100));

    有时你可能不想指定的太精确 ( 还记得前面测试不应太严格吗?指定的太精确会导致测试健壮性不足,并影响测试的本意。所以我们鼓励你只指定那些必须要指定的参数,不要多,也不要少 ) 。如果你只关心 Forward 是否会被调用,而不关心它用什么参数,你可以写 _ 作为参数,它的意义是“任意”参数。

using ::testing::_;

...

// Expects the turtle to move forward.

EXPECT_CALL(turtle, Forward(_));

    _ 是我们称为 Matchers 的一个例子,一个 matcher 是像一个断言,它可测试一个参数是否是我们期望的。你可用在 EXPECT_CALL() 中任何写函数参数期望的地方用matcher 。

    一个内置的 matchers 可以在 CheatSheet 中找到,比如,下面是 Ge( greater than or equal ) matcher 的应用。

using ::testing::Ge;...

EXPECT_CALL(turtle, Forward(Ge(100)));

    这个测试是检查 turtle 是否被告知要至少前进至少 100 个单位。

Cardinalities: How Many Times Will It Be Called?

    在 EXPECT_CALL() 之后第一个我们可以指定的子句是 Times() 。我们称 Times的参数为 cardinality ,因为它是指这个函数应该被调用 多少次 。 Times 可以让我们指定一个期望多次,而不用去写一次次地写这个期望。更重要的是, cardinality可以是“模糊”的,就像 matcher 一样。它可以让测试者更准确地表达他测试的目的。

    一个有趣的特例是我们指定 Times(0) 。你也许已经猜到了,它是指函数在指定参数下不应该被调用,如果这个函数被调用了, Google Mock 会报告一个 Google Test 失败。

    我们已经见过 AtLeast(n) 这个模糊 cardinalities 的例子了。你可以在CheatSheet 中找一个内置 cardinalities 列表。

    Times() 子句可以省略。 如果你省略 Times() , Google Mock 会推断出cardinality 的值是什么。 这个规则很容易记:

l   如果在 EXPECT_CALL 中 既没有 WillOnce() 也没有 WillRepeatedly() ,那推断出的 cardinality 就是 Times(1) 。

l   如果有 n 个 WillOnce() ,但 没有 WillRepeatedl() ,其中 n >= 1 ,那么cardinality 就是 Times(n) 。

l   如果有 n 个 WillOnce() ,和一个 WillRepeatedly() ,其中 n >= 0 ,那么cardinality 就是 Times(AtLeast(n)) 。

小测试: 如果一个函数期望被调用 2 次,但被调用了 4 次,你认为会发生什么呢?

Actions: What Should It Do?

    请记住一个 Mock 对象其实是没有实现的。是我们这些用户去告诉它当一个函数被调用时它应该做什么。这在 Google Mock 中是很简单的。

    首先,如果 Mock 函数的返回类型是一个指针或是内置类型,那这个函数是有 默认行为 的 ( 一个 void 函数直接返回, bool 函数返回 false ,其它函数返回 0 ) 。如果你不想改变它,那这种行为就会被应用。

    其次,如果一个 Mock 函数没有默认行为,或默认行为不适合你,你可以用WillOnce 来指定每一次的返回值是什么,最后可以选用 WillRepeatedly 来结束。比如:

using ::testing::Return;...

EXPECT_CALL(turtle, GetX())

    .WillOnce(Return(100))

    .WillOnce(Return(200))

  .WillOnce(Return(300));

上面的意思是 turtle.GetX() 会被调用 恰好 3 次,并分别返回 100 , 200 , 300 。

using ::testing::Return;...

EXPECT_CALL(turtle, GetY())

.WillOnce(Return(100))

   .WillOnce(Return(200))

.WillRepeatedly(Return(300));

上面的意思是指 turtle.GetY() 将 至少 被调用 2 次,第一次返回 100 ,第二次返回200 ,从第三次以后都返回 300 。

当然,你如果你明确写上 Times() , Google Mock 不会去推断 cardinality 了。如果你指定的 cardinality 大于 WillOnce() 子句的个数时会发生什么呢?嗯,当WillOnce() 用完了之后, Google Mock 会每次对函数采用 默认 行为。

    我们在 WillOnce() 里除了写 Return() 我们还能做些什么呢?你可以用ReturnRef( variable ) ,或是调用一个预先定义好的函数,自己在 Others 中找吧。

重要提示: EXPECT_CALL() 只对行为子句求一次值,尽管这个行为可能出现很多次。所以你必须小心这种副作用。下面的代码的结果可能与你想的不太一样。

int n = 100;

EXPECT_CALL(turtle, GetX())

.Times(4)

.WillRepeatedly(Return(n++));

    它并不是依次返回 100 , 101 , 102... ,而是每次都返回 100 ,因为 n++ 只会被求一次值。类似的, Return(new Foo) 当 EXPECT_CALL() 求值时只会创建一个Foo 对象,所以它会每次都返回相同的指针。如果你希望每次都看到不同的结果,你需要定义一个自定义行为,我们将在 CookBook 中指导你。

    现在又是一个小测验的时候了!你认为下面的代码是什么意思?

using ::testing::Return;...

EXPECT_CALL(turtle, GetY())

.Times(4)

.WillOnce(Return(100));

    显然, turtle.Get() 期望被调用 4 次。但如果你认为它每次都会返回 100 ,那你就要再考虑一下了!记住,每次调用都会消耗一个 WillOnce() 子句,消耗完之后,就会使用默认行为。所以正确的答案是 turtle.GetY() 第一次返回 100 ,以后每次都返回 0 ,因为 0 是默认行为的返回值。

Using Multiple Expectations

    至今为止,我们只展示了如何使用单个期望。但是在现实中,你可能想指定来自不同 Mock 对象的 Mock 函数上的期望。

    默认情况下,当一个 Mock 函数被调用时, Google Mock 会通过定义顺序的 逆序去查找期望,当找到一个与参数匹配的有效的期望时就停下来 ( 你可以把这个它想成是“老的规则覆盖新的规则“ ) 。如果匹配的期望不能再接受更多的调用时,你就会收到一个超出上界的失败,下面是一个例子:

using ::testing::_;...

EXPECT_CALL(turtle, Forward(_));   // #1

EXPECT_CALL(turtle, Forward(10))   // #2

    .Times(2);

如果 Forward(10) 被连续调用 3 次,第 3 次调用它会报出一个错误,因为最后一个匹配期望 (#2) 已经饱和了。但是如果第 3 次的 Forward(10) 替换为 Forward(20) ,那它就不会报错,因数现在 #1 将会是匹配的期望了。

边注: 为什么 Google Mock 会以 逆序 去匹配期望呢?原因是为了可以让用户开始时使用 Mock 对象的默认行为,或是一些比较松驰的匹配条件,然后写一些更明确的期望。所以,如果你在同一个函数上有两个期望,你当然是想先匹配更明确的期望, 然后 再匹配其它的,或是可以说明确的规则会隐藏更宽泛的规则。

Ordered vs Unordered Calls

    默认情况下,即使是在前一个期望没有被匹配的情况下,一个期望仍然可以被匹配。换句话说,调用的匹配顺序不会按照期望指定的顺序去匹配。

    有时,你可能想让所有的期望调用都以一个严格的顺序来匹配,这在 Google Mock 中是很容易的:

using ::testing::InSequence;...

TEST(FooTest, DrawsLineSegment) {

  ...

  {

    InSequence dummy;

 

    EXPECT_CALL(turtle, PenDown());

    EXPECT_CALL(turtle, Forward(100));

    EXPECT_CALL(turtle, PenUp());

  }

  Foo();

}

    创建 InSequence 的一个对象后,在这个对象作用域中的期望都会以 顺序 存放,并要求调用以这个 顺序 匹配。因为我们只是依赖这个对象的构造函数和析构函数来完成任务,所以对象的名字并不重要。

( 如果你只是关心某些调用的相对顺序,而不是所有调用的顺序?可以指定一个任意的相对顺序吗?答案是 ... 可以!如果你比较心急,你可以在 CookBook 中找到相关的细节。 )

All Expectations Are Sticky (Unless Said Otherwise)

    现在让我们做一个小测验,看你掌握 Mock 到什么程度了。你如何测试 turtle 恰好 经过原点两次?

    当你想出你的解法之后,看一下我们的答案比较一下 ( 先自己想,别作弊 ) 。

using ::testing::_;...

EXPECT_CALL(turtle, GoTo(_, _))   // #1

    .Times(AnyNumber());

EXPECT_CALL(turtle, GoTo(0, 0))   // #2

.Times(2);

假设 turtle.GoTo(0,0) 被调用了 3 次。在第 3 次, Google Mock 会找到参数匹配期望 #2 。因为我们想要的是恰好经过原点两次,所以 Google Mock 会立即报告一个错误。上面的内容其实就是我们在“ Using Multiple Expectations ”中说过的。

    上面的例子说明了 Google Mock 中 默认情况下期望是严格的 ,即是指期望在达到它们指定的调用次数上界后仍然是有效的。这是一个很重要的规则,因为它影响着指定的意义,而且这种规则与许多别的 Mock 框架中是 不一样 的 ( 我们为什么会设计的不一样?因为我们认为我们的规则会使一般的用例更容易表达和理解 ) 。

    简单?让我看一下你是不是真懂了:下面的代码是什么意思:

using ::testing::Return;

...

for ( int i = n; i > 0; i--) {

  EXPECT_CALL(turtle, GetX())

      .WillOnce(Return(10*i));

}

    如果你认为 turtle.GetX() 会被调用 n 次,并依次返回 10, 20, 30, ... ,唉,你还是再想想吧!问题是,我们都说过了,期望是严格的。所以第 2 次turtle.GetX() 被调用时,最后一个 EXPECT_CALL() 会被匹配,所以马上会引起“超出上界”的错误。上面的代码其实没什么用途。

    一个正确表达 turtle.GetX() 返回 10, 20, 30,..., 的方法是明确地说明期望不是 严格的。换句话说,在期望饱和之后就 失效 。

using ::testing::Return;

...

for ( int i = n; i > 0; i--) {

  EXPECT_CALL(turtle, GetX())

    .WillOnce(Return(10*i))

    .RetiresOnSaturation();

}

    并且,有一个更好的解决方法,在这个例子中,我们期望调用以特定顺序执行。因为顺序是一个重要的因素,我们应该用 InSequence 明确地表达出顺序:

using ::testing::InSequence;

using ::testing::Return;

...

{

  InSequence s;

 

  for ( int i = 1; i <= n; i++) {

    EXPECT_CALL(turtle, GetX())

        .WillOnce(Return(10*i))

        .RetiresOnSaturation();

  }

}

    顺便说一下,另一个期望可能 不 严格的情况是当它在一个顺序中,当这个期望饱和后,它就自动失效,从而让下一个期望有效。

Uninteresting Calls

    一个 Mock 对象可能有很多函数,但并不是所有的函数你都关心。比如,在一些测试中,你可能不关心 GetX() 和 GetY() 被调用多少次。

    在 Google Mock 中,你如果不关心一个函数,很简单,你什么也不写就可以了。如果这个函数的调用发生了,你会看到测试输出一个警告,但它不会是一个失败。

What Now?

    恭喜!你已经学习了足够的 Google Mock 的知识了,你可以开始使用它了。现在你也许想加入 googlemock 讨论组,并开始真正地用 Google Mock 开始写一些测试——它是很有意思的,嗨,这可能是会上瘾的,我可是警告过你了喔!

    如果你想提高你的 Mock 等级,你可以移步至 CookBook 。你可以在那学习更多的Google Mock 高级特性——并提高你的幸福指数和测试快乐级别。

Copyright notice

    所有的内容全部翻译自  Google 的文档  Google C++ Mocking Framework for Dummies ,  Koala++/ 屈伟 如果在法律上拥有译作的版权,在此声明愿意自动放弃。
基于模型上下文协议(MCP)的可插拔式临床AI工具链Clinical DS研究(下) 本研究深入探讨了医疗AI在临床落地中的核心矛盾,即如何从“模型能答”迈向“系统可信、可用、可追溯”。为解决此矛盾,我们创新性地提出并详细设计实现了一套基于模型上下文协议(MCP)的**“可插拔式临床AI工具链”**架构。通过将复杂的医疗AI系统解构为Host、MCP Server和标准协议三层,并将各类能力(临床决策、影像分析、合规审计)封装为标准的、可独立演进的Server,我们成功地构建了一个模块化、高内聚、低耦合的系统。 阅读详情

相关推荐

Microapp 接入vite子应用

MicroApp接入vite版本,干货满满,手把手步骤说明,加上报错说明,赶紧上车!

outsider76557的博客 4660

Google/Mock

本文引用自http://www.tuicool.com/articles/n26rMvy 对于 c++ 来说写单元测试和 mock 框架不是一件容易的事情。还好, Google 为我们搭建了一个出色的单元测试和 mock 框架。网上的例子很多都过多强调概念,本文用一个简单的例子让大家对于什么是 gtest 和 gmock 让大家有一个直观的了解,让大家很快上手,就像写 hello word

mqdChalali的博客 709

【Qt】Window环境下搭建Qt6、MSVC2022开发环境(无需提前安装Visual Studio)

本文介绍 Windows 环境下无需安装 Visual Studio,搭建 Qt6 与 MSVC2022 开发环境的方法,以节省磁盘空间。核心步骤包括:用中科大镜像提速 Qt6 在线安装,需勾选 Qt Creator 17.0.1、MSVC 2022 x64 等组件;配置环境变量,添加 mingw_64、msvc2022_64 及 Qt Creator 的二进制目录;安装 MSVC 2022 编译器与 Windows 10 SDK 并记录版本;配置 Qt Creator 构建套件,可选设置 vcvarsal

油炸自行车的博客 2924

Gtest入门介绍(三 )

测试接口: 比如当我们在单元测试、模块的接口测试时,当这个模块需要依赖另外一个/几个类,而这时这些个类还没有开发好(那名开发同学比较懒,呵呵),这时我们就可以定义了Mock对象来模拟那些类的行为。 说得更直白一些,就是自己实现一个假的依赖类,对这个类的方法你想要什么行为就可以有什么行为,你想让这个方法返回什么结果就可以返回怎么样的结果 EXPECT_CALL(mock_object, method(matcher1, matcher2, ...)) .With(multi_argument_matcher)

黑塞的博客 4268

Claude Code教程(二) | Claude Code 核心信息与使用指南

Claude Code 核心信息与使用指南

qq_20236937的博客 2185

告别外置电阻!揭秘MAX22201集成电流检测的5大设计优势(附PCB布局案例)

本文深入解析MAX22201集成电流检测技术在直流有刷电机驱动中的5大设计优势,包括BOM成本降低、PCB空间优化、动态性能提升等。通过与传统方案(如DRV8871+外置电阻)的实测对比,展示其在高精度电流检测、抗干扰能力和PCB布局简化方面的突破,并附有详细的PCB布局案例和配置指南。

weixin_29189377的博客 243

代码实验室: C语言 代码测试 之 匹配器

有时单元测试的时候,需要检验 子函数的入参。如下代码,caculate被调用时,想要获取子函数square的参数value 的值。 这时就需要用到 代理函数的功能。

nowETforever的专栏 624

livox avia平台搭建

livox雷达数据采集平台搭建

Shilong的博客 1310

GoogleTest之设置期望

创建一个mock对象mock_object,这个对象有一个名为method_name的方法,方法的参数为matchers…EXPECT_CALL必须在任何mock对象之前使用。

u010378559的博客 2873

使用Python爬虫抓取旅游景点评价数据并进行热度可视化

景点热度通常由景点的评分、评论数以及游客的热情度来决定。高热度的景点通常意味着更高的游客评分和更多的游客评论。热度不仅反映了景点的受欢迎程度,还可以揭示某些景点的潜力和存在的问题。评分:游客对景点的综合评分,通常是0到5分。评论数:景点的评论数量,反映了游客对景点的关注程度。热度变化:在一定时间内,景点的评价和评论数量变化,能够反映景点的热度波动。通过使用Python爬虫技术抓取旅游景点的评价和评论数据,我们能够深入分析景点的热度,并通过数据可视化工具将这些信息展示给用户。

2201_76125261的博客 1282

Android 15.0 首次开机默认授予app运行时权限(去掉运行时授权弹窗)

在15.0的系统rom产品定制化开发中,在6.0以后对于权限的申请,都需要动态申请,所以会在系统首次启动后,在app的首次运行时, 会弹出授权窗口,会让用户手动授予app运行时权限,在由于系统产品开发需要要求默认授予app运行时权限,不需要用户默认授予运行时弹窗,所以需要在首次开机默认授予所有app运行时权限

安卓兼职framework和app工程师的博客 1204

Google Mock 启蒙篇

Google Mock 入门译文重排版:修正 OCR 乱码和代码块,补上 2026 编者注、MOCK_METHOD 新旧写法对照,以及官方 googletest 仓库接入方式。

左手是诗,右手是代码。 5630

100天精通Python(基础篇)——第1天:Python从起源到应用的全面解析(附上Python、PyCharm、VSCode下载安装详细教程)

100天精通Python(基础篇)——第1天:Python从起源到应用的全面解析(附上Python、PyCharm、VSCode下载安装详细教程)

努力让自己发光,对的人才能迎着光而来 101万+

Google Mock进阶篇 (Google Mock Cookbook译文)

原文链接:http://quweiprotoss.blog.163.com/blog/static/40882883201222721548449/ Google C++ Mocking Cookbook Version: 0.32 作者:Adrian Alexander 译者:Koala++ /屈伟 最新pdf版下载    你来对地方了,这里你可以找到Go

幽雨雨幽 1万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Google Mock启蒙篇 [2] (Google C++ Mocking Framework for Dummies 翻译)

Setting Expectations     成功地使用Mock对象的关键是在它上面设置合适的期望。如果你设置的期望太过严格,你的测试可能会因为无关的改变而失败。如果你把期望设置的太过松驰,bugs可能会溜过去。而你需要的是你的测试可以刚好捕获你想要捕获的那一种bug。Google Mock提供了一些方法可以让你的测试尺度刚好( just right )。 General Sy

幽雨雨幽 2074

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

gmock学习二 转载

Google Mock启蒙篇 [2] (Google C++ Mocking Framework for Dummies 翻译) 2011-11-22 22:34:58|分类:C++|标签:googlemock测试|举报|字号订阅 Setting Expectations 成功地使用Mock对象的关键是在它上面设置合适的期...

weixin_30815427的博客 707

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

TDD测试驱动学习

TDD 测试驱动学习

虾球 1558

Google Mock 入门

Google Mock 入门 原文 概述 什么是Mock? Mock,更确切地说应该是Mock Object。它究竟是什么?它有什么作用?在这里,我也只能先说说我的理解。 比如当我们在单元测试、模块的接口测试时,当这个模块需要依赖另外一个/几个类,而这时这些个类还没有开发好(那名开发同学比较懒,呵呵),这时我们就可以定义了Mock对象来模拟那些类的行为。 说得更直白一些,就是自己实现一个假的依赖类,对这个类的方法你想要什么行为就可以有什么行为,你想让这个方法返回什么结果就可以返回怎么样的结果。 但这时很多同

weixin_43254989的博客 1877

C++开发测试工具gmock使用详解——对抽象接口类进行gmock打桩并测试

目录一、简单Demo1.1 共同约定1.2 小A任务1.3 我的任务1.4 常规运行1.5 测试输出二、基本流程三、MOCK_METHOD四、EXPECT_CALL 第一篇文章(C++开发测试工具gmock的安装与使用超详解)和第二篇文章(C++开发测试工具gmock的使用详解)分别对gmock的安装、配置与使用案例进行了详细介绍,本文将对抽象接口类进行gmock打桩测试进行介绍,结合上文一起食用效果更佳哦~ 一、简单Demo 首先来编写一个简单Demo,编写代码之前,首先需要将解决方案的平台与目标程序一致

Wendy的博客 1万+

google mock分享

转一篇小亮同学的google mock分享 Content Matcher(匹配器) 基数(Cardinalities) 行为(Actions) 序列(Sequences) Google Mock 入门 概述 Google Mock使用 Mock实践 Google Mock Cookbook 什么是Mock? Google Moc

jfkidear的专栏 1万+

【gmock】Google Mock 入门

目录1 概述1.1 什么是Mock?1.2 Google Mock概述1.3 参考文档2 Google Mock使用2.1 最简单的例子2.2 典型的流程2.3 自定义方法/成员函数的期望行为2.3.1 Matcher(匹配器)2.3.2 基数(Cardinalities)2.3.3 行为(Actions)2.3.4 序列(Sequences)3 Mock实践3.1 我改过的例子3.2 现实中的例子4 Google Mock Cookbook4.1 Mock protected、private方法4.2 M

梦心之魂的博客 5012

玩转单元测试之gmock

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

Black.Spider的博客 1234

Google Mock - GoogleTest(八)

这篇是GoogleMock的简介文档,会在后边附带一个自己的例子。 一、什么是Google C ++ Mocking Framework? 当你写一个原型或测试,往往不能完全的依赖真实对象。一个mock对象实现与一个真实对象相同的接口,但让你在运行时指定它时,如何使用?它应该做什么?(哪些方法将被称为?什么顺序?多少次?有什么参数?他们会返回什么?等) 注意:很容易混淆伪造对象和模拟对象。fakes和mock在测试驱动开发(TDD)社区中实际上意味着非常不同的东西: Fake(伪对象)有工作实...

生活需要深度 1683

编写自己的Matcher与如何让编译器识别被mock的重载函数

MATCHER_P中的P代表参数,MATCHER_P其实应该写成“MATCHER_P1”,表示该matcher的构造函数只接受一个参数,同样的还有“MATCHER_P2、MATCHER_P3,..., MATCHER_P10”。宏的第一个参数代表该Matcher的类名,第二个参数代表Matcher的构造函数中的第一个参数,最后一个空内容的字符代表失败时输出信息,为空那么gmock会默认为你填写相关信息。在测试重载的mock函数时,需要对Matcher做特别的封装,否则编译在查找重载函数时会出现歧义。

hjwang1的专栏 761

mock单元测试 InvalidUseOfMatchersException

错误信息: org.mockito.exceptions.misusing.InvalidUseOfMatchersException: Invalid use of argument matchers! 1 matchers expected, 2 recorded: ... This exception may occur if matchers are combined with raw ...

weixin_44490757的博客 8730

google mock 语法基础篇 (三)

Google Test语法教程 基础篇(一) Google Test 单元测试 语法教程 进阶篇(二) google mock 语法基础篇 gtest语法对单元测试框架进行了支持。而gmock语法则对函数的模拟进行强大支持。 现在我将介绍gmock的语法 语法:ON_CALL 使用场景:设置MOCK函数被调用时,指定参数时的默认的返回值。 大家可以关注我的公众号 ctestcode 有许多非常好用的C语言开发工具。交流更多的C 语言开发的经验。 ...

nowETforever的专栏 1300
上一篇: Google C++ Mocking Framework使用简介 安装:
下一篇: Cover、Rational PureCoverage、BullseyeCoverage
linuxheik
博客等级 码龄15年 865粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值