首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

gmock SetArgReferee:设置不可复制、不可移动的对象

SetArgReferee 是 Google Mock 框架中的一个函数,用于在模拟对象的方法调用中设置引用参数的值。这个函数特别适用于那些不可复制(non-copyable)且不可移动(non-movable)的对象,因为这些对象不能通过常规的方式传递给模拟方法。

基础概念

Google Mock 是一个 C++ 的单元测试框架,它允许开发者创建模拟对象来替代真实对象,以便在测试中控制对象的行为。SetArgReferee 函数允许你在模拟方法调用时,将一个对象的引用传递给该方法,而不是复制或移动对象。

优势

  1. 性能优化:避免了不必要的对象复制或移动,提高了测试的性能。
  2. 灵活性:可以传递任何类型的对象,包括那些不可复制或不可移动的对象。
  3. 精确控制:可以在测试中精确地控制模拟方法接收到的参数值。

类型与应用场景

SetArgReferee 可以用于任何需要引用传递的场景,特别是当对象是资源管理类(如智能指针、文件句柄等)或者具有复杂构造函数的对象时。

示例代码

假设我们有一个不可复制的类 NonCopyable,并且我们想要模拟一个接受该类引用的方法:

代码语言:txt
复制
class NonCopyable {
public:
    NonCopyable(int value) : value_(value) {}
    int getValue() const { return value_; }
private:
    int value_;
    NonCopyable(const NonCopyable&) = delete;
    NonCopyable& operator=(const NonCopyable&) = delete;
};

class MockClass {
public:
    MOCK_METHOD(void, MethodWithRef, (const NonCopyable&));
};

TEST(MockTest, SetArgRefereeExample) {
    MockClass mock;
    NonCopyable nc(42);

    EXPECT_CALL(mock, MethodWithRef(_))
        .WillOnce(DoAll(SetArgReferee<0>(nc), Return()));

    mock.MethodWithRef(nc); // 实际调用时可以传递任意 NonCopyable 对象
}

在这个例子中,SetArgReferee 被用来设置 MethodWithRef 方法的引用参数为 nc 对象的值。

遇到的问题及解决方法

如果你在使用 SetArgReferee 时遇到问题,可能是因为:

  1. 对象生命周期问题:确保传递给 SetArgReferee 的对象在模拟方法调用期间是有效的。
  2. 引用绑定问题:确保 SetArgReferee 正确地绑定了引用参数。

解决方法:

  • 确保对象的生命周期足够长,或者在测试中创建对象的副本。
  • 使用 testing::Ref 来包装对象,以确保引用正确绑定。
代码语言:txt
复制
EXPECT_CALL(mock, MethodWithRef(_))
    .WillOnce(DoAll(SetArgReferee<0>(testing::Ref(nc)), Return()));

通过这种方式,你可以确保 SetArgReferee 正确地处理不可复制、不可移动的对象,并且在测试中有效地使用它们。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • Python中的可变对象与不可变对象

    Python中所有类型的值都是对象,这些对象分为可变对象与不可变对象两种: 不可变类型 float、int、str、tuple、bool、frozenset、bytes tuple自身不可变,但可能包含可变元素...,如:([3, 4, 5], 'tuple') 可变类型 list、dict、set、bytearray、自定义类型 +=操作符 +=操作符对应__iadd__魔法方法,对于不可变对象...,可通过拷贝来避免不同对象间的相互影响。...在Python中,不可变对象,浅拷贝和深拷贝结果一样,都返回原对象: import copy ​ ​ t1 = (1, 2, 3) t2 = copy.copy(t1) t3 = copy.deepcopy...,只是若原对象中存在可变属性/字段,则浅拷贝产生的对象的属性/字段引用原对象的属性/字段,深拷贝产生的对象和原对象则完全独立: l1 = [1, 2, 3] l2 = l1.copy() print(l1

    79510

    Python中的可变对象和不可变对象

    什么是可变/不可变对象 不可变对象,该对象所指向的内存中的值不能被改变。...当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址。 可变对象,该对象所指向的内存中的值可以被改变。...先看不可变对象 不可变对象的例子 先说明一点is 就是判断两个对象的id是否相同, 而 == 判断的则是内容是否相同。...当变量要改变时,实际上是把原来的值复制一份后再改变,开辟一个新的地址,astr再指向这个新的地址(所以前后astr的id不一样),原来astr对应的值因为不再有对象指向它,就会被垃圾回收。...可变对象由于所指对象可以被修改,所以无需复制一份之后再改变,直接原地改变,所以不会开辟新的内存,改变前后id不变。

    1.3K50

    python可变对象和不可变对象的解释

    数据类型分为可变、不可变。可变对象表示可以原处修改该数据对象,不可变对象表示必须创建新对象来保存修改后的数据。...在基础数据类型中: 数值、字符串、元组、frozenset是不可变对象 列表、set、dict是可变对象 对于可变对象,比如有一个列表L,查看它的id以及第一个元素的id。...),列表包含至少3个数据内存块,分别存放了3个字符串类型的数据(实际上是存放了这3个字符对象的地址)。...可变对象(不仅仅是这里的序列、列表)意味着修改该数据对象,不会在内存中新创建另一个内存空间来存放新数据对象。例如,修改这个列表中的第一个元素为"aa"。...为什么修改列表中的元素需要创建新的内存块?这是因为这个元素是字符串,而字符串是不可变对象。 不可变对象意味着,不能在原始内存地址块中修改数据,必须新创建一个地址块来保存修改后的数据对象。

    1.3K20

    Java中的可变对象(Mutable)与不可变对象(Immutable)

    如何在 Java 中创建不可变对象?我以前以为所有对象都是不可变的,因为如果你改变一个 String 实例的内容,它总是会创建一个新的 String 对象并指向该对象。...不可变类是指实例创建后不可修改的类。不可变对象的状态在创建过程中就已设定,创建后无法更改。例如,String 和 Integer 就是不可变类的例子。...Java 中不可变对象与可变对象的区别 以下是 Java 中可变类和不可变类之间的一些主要区别: 1. 修改 可变对象在创建后可以修改,但不可变对象在创建后不能修改。 2....而不可变对象则适用于需要确保对象状态保持不变或需要线程安全的情况。 5....不可变类通常是并发或多线程环境中的首选,可以简化对对象状态的推理。

    38030

    117-可变与不可变对象的效率

    python是一种解释型的语言,执行效率要比C这样的编译型语言差得多,但是也应该注意它的效率。...python的各种数据类型,按更新模型可以分为可变类型(如列表、字典)和不可变类型(如数字、字符串和元组)。多使用可变类型,它的执行效率比不可变类型要高。...在《37-生成密码/验证码》中,将结果保存到了一个名为 result 的变量中。...result 是字符串,字符串不可变,所以python在工作时,首先要申请一段内存储 result 的初值(空串''),随机取得一个字符后(如'a'),result += 'a'实际上是要重新申请一个新的内存...如果变量 result 使用列表,只需要为其分配一次内存即可,因为列表是可变的。

    51610

    【JavaScript】内置对象 - 字符串对象 ② ( 字符串类型不可变性 | 字符串不可变的好处 | 字符串不可变 - 示例分析 )

    一、字符串不可变 1、字符串类型不可变性说明 在 JavaScript 中 , 一个字符串 一旦被创建 , 之后就不能更改该字符串的值 ; 尝试修改一个字符串变量时 , 实际上是在内促中开辟出了一块新的内存空间..., 并在该控件中创建了一个新的字符串 , 赋值给原来的字符串变量 ; 每次修改字符串 , 都需要消耗更多的内存 , 但是从线程安全 , 性能优化 角度出发 , 字符串不可修改获益更大 ; 2、字符串不可变的好处...字符串不可变的好处 : 线程安全 : 多个线程操作 同一个字符串 , 由于字符串不可变 , 不会出现数据竞争或数据不一致的问题 ; 优化性能 : 对字符串进行 拼接 , 截取 , 查找 等操作时 ,...由于字符串不可变 , 可以提高字符串相关操作的性能 ; 内存回收 : 字符串不可变 , 一旦修改直接废弃原来的字符串创建新字符串 , 废弃的字符串一旦没有引用指向它们 , 其占用的内存会被直接回收 ;...-- 设置 meta 视口标签 --> <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable

    6000

    详解Python中的可哈希对象与不可哈希对象(二)

    mutable与不可变对象inmutable。...简要的说可哈希的数据类型,即不可变的数据结构(数字类型(int,float,bool)字符串str、元组tuple、自定义类的对象)。 (1)为什么不可变数据类型是可哈希hashable的呢?...对于不可变类型而言,不同的值意味着不同的内存,相同的值存储在相同的内存,如果将我们的不可变对象理解成哈希表中的Key,将内存理解为经过哈希运算的哈希值Value,这不正好满足哈希表的性质嘛。...如果一个对象是可哈希的,那么在它的生存期内必须不可变(而且该对象需要一个哈希函数),而且可以和其他对象比较(需要比较方法).比较值相同的对象一定有相同的哈希值,即一个对象必须要包含有以下几个魔术方法:...注意:这需要能够很好的理解可变对象与不可变对象的内存分配才好哦! (2)为什么不可变对象能作为键Key?

    10.4K63

    DDD系列:什么是“值对象是不可变的”

    软件系统是物理世界的映射。在一个没有出现任何变化的物理世界中,是没有必要开发一个软件系统来提高效率的。那么值对象的“不可变”具体是指什么不可变呢?值对象不可变,为什么实体就可变了呢?...不可变,是指软件系统中能够唯一确定一个主体的属性不可变。从这个维度来看实体和值对象都不可变。 不可变,不是说软件系统中这些关键属性一旦持久化,就不能修改了。是可以修改的。...只要这四个属性相同,就代表了物理世界上相同的位置。 值对象的领域模型与数据模型示例 不可变,是指一个人员的省、市、县、街道四个属性任何一个改变了,就变成一个新地址了。...即这个人员在软件系统中的地址就映射到了物理世界中另一个位置了。这个人员的老地址在软件系统中找不到了。不可变,指代表的业务含义不可变。...即使源端商品或地址所在聚合出现服务不可用的情况,也不会影响订单聚合中商品或地址相关的业务逻辑,很好地实现了应用的解耦和故障隔离。

    1K10

    你不可不会的几种移动零的方法

    今天给大家带来一道与数组相关的题目,这道题同时也是脸书和彭博的面试题,即力扣上的第 283 题-移动零。...移动零 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。...解题思路 根据题意,要把数组中所有 0 移动到数组的末尾,还要保持非零元素的「相对位置」,只需要遍历一遍数组,找出「非零元素」,然后将找出的非零元素替换原数组的元素,原数组中「未替换的元素全部用零去替换...移动零.gif 「说明」 不需要全部查找完数组中的非零元素之和,再去替换,可以「边查找边替换」,这样就不需要「开辟额外空间存储查找到的非零元素」。...「i 是否等于 k」的判断,这是因为如果数组中的元素都是「非零元素」,就不需要「自己与自己交换」,也算是一个小的优化。

    34300

    你不可不会的几种移动零的方法

    今天给大家带来一道与数组相关的题目,这道题同时也是脸书和彭博的面试题,即力扣上的第283题-移动零。...移动零 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。...解题思路 根据题意,要想把数组中所有 0 移动到数组的末尾,还要保持非零元素的「相对位置」,只需要遍历一遍数组,找出「非零元素」,然后将找出的非零元素替换原数组的元素,原数组中「未替换的元素全部用零去替换...替换 遍历、查找和替换的完整过程,如下动图示。 ? 完整动图 「说明」 不需要查找完数组中的非零元素之和,再替换,可以「边查找边替换」,这样就不需要「开辟额外空间存储查找到的非零元素」。...「i 是否等于 k」的判断,这是因为如果数组中的元素都是「非零元素」,就不需要「自己与自己交换」,也算是一个小的优化。

    31210

    关于防止改变对象内部不可变状态的小例子

    Java相对于c而言,是一门比较安全的语言,免去了指针操作带来的各种不安全因素,但是当你构建一个类,给别人提供接口,在交互的过程也会带来不少麻烦,有时候甚至会改变对象内部的不可变状态,请看下面例子。...,有女友的程序员朋友都知道,初次约会的时候,女生最喜欢男友准时准点地在那里等,而不是干巴巴地让女孩子在等,等久了,是要删游戏装备的,哈哈。...所以约会的时间不能随意改变,在这里用了final关键字修饰(注意,final修饰变量,如果是基本类型,则值当然不可变,若是对象,指的是它不能指向其他对象,而引用的对象本身是可变的)。...那这是否意味着date不可变了呢,答案是否定的,请看: Calendar cal = Calendar.getInstance(); cal.set(2016, 3, 22);...,还是有不少出差错的可能的,软件是一件需要不断精细打磨的艺术品,所有的程序员都是工匠,是艺术家。

    87890

    Java并发-推荐使用不可变对象的原因分析

    一、不可变对象的引出 在Java语法中,String即是不可变对象,一旦创建,假设你若想修改String对象值,只能重新创建String对象。...---- 二、不可变对象 2.1 什么是不可变对象 其实不光是String对象,Java中的很多对象都符合上述不可改变状态的特性。...所以,不可变对象的好处在于,只要对象符合不可变原则,该对象在线程间传递是不会产生冲突的。这就将以前的到处可能是坑的多线程编程解耦为安全的两步,首先使用不可变对象,然后在线程间传递不可变对象。...况且Java本身也并不是纯粹的函数式编程语言。 2.3.2 性能上的额外开销 由于不可变对象需要复制一份状态用于修改后返回新的的对象,如果设计和使用不当的话,可能因此形成性能瓶颈点。...比如颜色数值和颜色名可以因为多线程的调动而对应不上。 3.2定义不可变对象的策略 以下的一些规则是创建不可变对象的简单策略。

    61920

    你不可不会的几种移动零的方法(续集)

    在上期 你不可不会的几种移动零的方法 中,小熊主要介绍了「末尾补零」和「交换零元素与非零元素」两种方法解答力扣第283题-移动零。...本文提供采用「双指针」策略的「覆盖法」来解决这道题,供大家参考,希望对大家有所帮助。 移动零 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。...解题思路 根据题意,要把数组中所有 0 移动到数组的末尾,还要保持非零元素的「相对位置」,可以通过设置两个指针(i 和 j),其中 i 用于遍历整个数组,j 用于依次保存 i 在遍历时遇到的非零元素,当...空间复杂度:「O(1)」,未开辟额外的存储空间。 「说明」 代码中加「i 是否等于 k」的判断,为了避免当数组中的所有元素都是「非零元素」,再去保存非零元素,也算一个小的优化。...你不可不会的几种移动零的方法 茫茫人海,如何快速找到合适的 ta? 二分查找应用---有序数组中的单一元素 更多精彩 关注公众号「程序员小熊」

    44620

    比特币和区块链(4):比特币成功的不可复制性

    0 上一篇我们详细介绍了比特币的共识机制。简单来说,比特币的共识机制是通过算力来随机选择产生新区块的节点,通过给予产生新区块的节点比特币奖励来做好人。...这整个系统的健壮安全运行,从博弈论角度来看,有着一套非常复杂的的互相壮大的体系在里面。 换句话来说,虽然比特币的源代码是开放的。...但是今天如果我们把比特币的源代码稍微改一点复制一份,然后作为其他币发行出去,这个新发行的币,很大程度上不会达到比特币的高度。 这种更改源代码发行的币并非没有,莱特币是里面较为成功的一个。...所以这一篇文章的主要目的是探讨一下比特币到底是怎么样就变成不可取代了。 1 从技术层面来说,比特币网络的共识,依赖于全网络里面有多数的好人节点在按照好人模式工作。...所以单纯禁止挖矿是否会导致比特币不可用是值得商榷的。 而现实世界里会不会越来越多的用比特币。我个人觉得是的。因为不需要第三方平台做担保,和比特币不可贬值的特性,都具有足够的吸引力。

    1.2K70

    对象存储违规页面频发,不可忽视的重灾区

    随着互联网的飞速发展,数据存储和访问需求呈现出爆炸性增长。对象存储的违规页面的问题也日益凸显,成为了开发者关注的焦点。 本文将简单探讨对象存储成为违规页面重灾区的原因,并提出相应的解决策略。...对象存储的违规页面 对象存储以其高可扩展性、低成本和易用性赢得了众多企业和开发者的青睐。开放性和便捷性使得用户可以轻松上传访问文件,这些特点也为违规页面的滋生提供了土壤。...为了避免服务器遭受上传漏洞的威胁,开发者通常会采用环境隔离策略,采用对象存储来存储和访问文件。...为了增强安全性,对象存储中业务域名设置防盗链,并限制文件上传的类型,禁止上传HTML、HTM、SVG等文件格式。 结语 定期审查数据、加强安全设置、并建立有效的文件上传验证机制是至关重要的。...避免资源浪费,维护业务的正常运行。 如果您对对象存储安全性或其他技术话题感兴趣,请关注我们的公众号,获取更多相关内容和实用建议。

    16210

    一款移动端必不可少的超级轻量级框架

    大家好,我是前端实验室的小师妹! 这次给大家介绍一个移动端超级轻量级的消息提示框开源组件 Pxmu介绍 Pxmu 是移动端超轻量的消息提示框插件 无需任何依赖,即可运行。...PC和移动端都可使用,样式精美,可自定义动画/颜色/字体等 特点是轻量无依赖,整个插件只有一个 js 文件,支持常用的消息提示功能。...功能特性 支持常见的 toast / loading / dialog / fail 等状态提示 全局使用 flex 布局,自适应兼容性好 专为移动端设计,但 PC 和移动端都可使用 样式、动画、颜色、...图标等都支持自定义 相比于大而全的 UI 组件库,它只解决了消息提示这个单一的功能,api 也很简单,官网所有的文档和代码例子都很简短,没有什么难度。...访问到支持的方法。

    1.7K40
    领券