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

gmock多个输入输出参数SetArgReferee

基础概念

Google Mock(简称gMock)是Google Test的一部分,用于创建和使用C++模拟对象。模拟对象允许你在不依赖实际实现的情况下测试代码。SetArgReferee是gMock中的一个功能,允许你在模拟方法调用时设置参数的值。

相关优势

  1. 解耦测试与实现:通过模拟对象,你可以独立于实际实现进行测试,这使得测试更加灵活和可控。
  2. 提高测试覆盖率:模拟对象可以帮助你覆盖更多的代码路径,特别是那些依赖于外部系统或服务的代码。
  3. 简化测试环境搭建:不需要实际部署和配置复杂的环境,只需创建模拟对象即可。

类型

SetArgReferee主要用于设置模拟方法调用时的参数值。它有以下几种类型:

  1. SetArgPointee:设置指针参数的值。
  2. SetArgRef:设置引用参数的值。
  3. SetArrayArgument:设置数组参数的值。

应用场景

假设你有一个接口Calculator,其中有一个方法Add,它接受两个整数并返回它们的和。你可以使用gMock来模拟这个接口,并在测试中设置参数的值。

代码语言:txt
复制
class Calculator {
public:
    virtual int Add(int a, int b) = 0;
};

class MockCalculator : public Calculator {
public:
    MOCK_METHOD(int, Add, (int a, int b), (override));
};

在测试中,你可以使用SetArgReferee来设置参数的值:

代码语言:txt
复制
TEST(CalculatorTest, Add) {
    MockCalculator mock;
    EXPECT_CALL(mock, Add(2, 3))
        .WillOnce([](int a, int b) {
            return a + b;
        });

    EXPECT_EQ(mock.Add(2, 3), 5);
}

遇到的问题及解决方法

问题:为什么SetArgReferee没有生效?

原因

  1. 调用顺序错误:确保在调用模拟方法之前设置参数值。
  2. 参数类型不匹配:确保设置的参数类型与模拟方法中的参数类型匹配。
  3. 未正确使用EXPECT_CALL:确保在测试中使用EXPECT_CALL来设置期望的调用和行为。

解决方法

  1. 检查调用顺序,确保在调用模拟方法之前设置参数值。
  2. 确保设置的参数类型与模拟方法中的参数类型匹配。
  3. 确保正确使用EXPECT_CALL来设置期望的调用和行为。
代码语言:txt
复制
TEST(CalculatorTest, Add) {
    MockCalculator mock;
    EXPECT_CALL(mock, Add(2, 3))
        .WillOnce([](int a, int b) {
            return a + b;
        });

    EXPECT_EQ(mock.Add(2, 3), 5);
}

参考链接

通过以上信息,你应该能够更好地理解和使用gMock中的SetArgReferee功能,并解决相关的问题。

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

相关·内容

  • mybatis 拦截器 添加参数_mybatis传递多个参数

    上一篇中讲了mybatis拦截器的实现 这一篇扩展mybatis在拦截器中添加额外参数 在mybatis的mapper.xml文件中,我们可以使用#{}或${}的方式获取到参数,这些参数都需要提前我们在...mapper.java接口文件中通过参数的方式传入参数才能取到 为了扩展参数,我们需要了解mybatis是怎么帮我们保管mapper.java中传入的参数的 进入Executor.java接口查看query...方法,可以看到第一个参数MappedStatement对象中有一个parameterMap字段,该字段是Map类型保存我们的参数,那我们只需要在拦截器中对MappedStatement对象的parameterMap...中put自己想要的参数即可 代码如下 /** * 部门数据拦截器 * * @author zhangxing * @date 2021/4/12 */ @Intercepts({ @Signature...,pageHelper的拦截器中对参数进行了校验,因为自定的拦截器还没有执行,则Map中不会有自定义参数,当pageHelper的拦截器开始校验参数的时候就会报错找不到参数 如何将自定义的拦截器放在PageHelper

    1.8K20

    实现函数的输入输出参数的强类型检验

    使用FastAPI的体验都比较清楚,在FastAPI中,接口的输入输出参数是可以定义成强类型的,这也是自己最初看到FastAPI就觉得这就是Python当前最好的框架之一。...总结一下,我们的实现方式应该做到如下两个要求: 非侵入式的,尽量避免对业务代码的更改; 实现输入输出参数的强类型校验。 参考FastAPI的实现,我们的实现应该也是采用包装器的形式来实现。...校验包装器实现 使用包装器实现输入输出参数的校验,具体代码如下: from functools import wraps from inspect import get_annotations from...注意如果多传了参数,这是不会报错的,需要在包装器中使用代码进行判断; 使用“get_annotations”获取目标函数的输入输出参数的类型信息; 输出参数:这个的校验比较特别,试了好几种方法,最后觉得这样式最好的...说明:因为我们的场景下,输入输出都需要是普通的数据,并没有将输入输出转成强类型数据,外部在调用时(通过HTTP接口)还是普通的输入输出

    22221

    多个构造器参数使用构建器

    当有很多可选参数时,我们常常采用“重叠构造器”模式,在上例中也就是第一个只有必要参数的构造器,第二第三个均为可选。当然还有下面这种更为简单的写法——Javabeans模式。...下面就是不采用以上两种方法,而实现多种构造器参数的情况。...new Student3.Builder("kevin").age(22).build(); 20 } 21 } 重叠构造器是我们在编码过程中最为常见的一种方法,唯一的缺点是灵活度还不够高,如果参数有变化...JavaBeans模式是最为简单粗暴的方法,它很严重的问题就在于不是线程安全的,我们在实例化一个对象使用setter方法对它进行初始化时,这个时候JavaBean可能处于不一致的状态,所以在多个构造器参数时...构建器模式就是一种很好的应对过个构造器参数的方法,灵活性高,类似其他语言中的“链”,下次在遇到类似情况时,不妨使用构建器模式。

    90980

    【Spring】“请求“ 之传递单个参数、传递多个参数和传递对象

    在发送请求时,可能会带一些参数,所以学习 Spring 的请求,主要是学习如何传递参数到后端,以及后端如何接收 传递参数,我们主要是使用浏览器和 Postman 来模拟 后端开发人员无需太过于关注如何传递参数...传递多个参数 如何接收多个参数呢? 和接收单个参数一样,直接使用方法的参数接收即可。...使用多个形参 @RequestMapping("/m2") public String method2(String name, String password) { return "接收到参数...:name=" + name + ", password=" + password; } 可以看到,后端程序正确拿到了 name 和 password 参数的值 当有多个参数的时候,前后端进行参数匹配的时候...,是以参数的名称进行匹配的,因此参数的位置是不影响后端获取参数的结果 3.

    18110

    pyMySQL SQL语句传参问题,单个参数多个参数说明

    = '-' sql_talk="UPDATE cnp.Test set a='' where b='%s'" cursor.execute(sql_talk % field) db.commit() 多个传参用...='{1}'".format(a,field) cursor.execute(sql_talk) db.commit() 补充知识:python自动化之pymysql库使用变量向SQL语句中动态传递参数...(sql注入 || 传参策略) 使用python 3连接Mysql实现自动化增删查改库内数据,由于项目原因很多的sql语句过于复杂,导致sql语句内传递的参数过多而且容易变动,导致很多同学不知从何下手动态的传递参数...1.4 FROM mm_project_uv_outdoor WHERE poiid = %s AND currenttime = %s" cursor = db.cursor() # 以下为传递多个参数的用法...最后建议大家多看官方的文档或标准教程,这样更有益学习 以上这篇pyMySQL SQL语句传参问题,单个参数多个参数说明就是小编分享给大家的全部内容了,希望能给大家一个参考。

    6.1K10

    【C++学习】:命名空间、输入输出和缺省参数全面解析

    前言 本文将介绍C++中的命名空间、输入输出操作以及缺省参数的概念和使用方法。通过本文的学习,读者将了解到命名空间的定义、特性和使用方法,以及C++中的输入输出操作和缺省参数的概念及使用方式。...同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。 一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。...输入输出 在C语言中我们使用的是printf和scanf来进行输入和输出的操作,c++又是怎么样的呢?...此外,还介绍了C++中的输入输出操作,包括使用cout进行标准输出和使用cin进行标准输入。最后,文章还介绍了缺省参数的概念及全缺省参数和半缺省参数的使用方法,以及一些细节点的注意事项。...通过本文的学习,读者可以更好地理解和应用C++中的命名空间、输入输出操作和缺省参数

    16210

    Google 单元测试框架

    gtest 定义了宏供我们写断言语句,一个或者多个断言组成我们的测试用例 case,多个测试用例有时候需要共享一些通用对象,可以把这些用例放在同一个 fixture 中。...Fixture 多个用例需要使用相同的数据,每次都在用例中准备显得很重复麻烦,这时候,可以使用 Fixture 来构建用例,使多个用例共用相同的数据对象配置。...,但是我们可以在运行时指定他的行为,如何被使用,使用多少次、参数,使用时返回什么等。...测试程序 参考 gmock 编程指导和 codebook gmock mock 对象,可以定义函数期望行为,如被调用时返回的值,期望被调用的次数,参数等,如果不满足就会报错。...举个例子,mock 一个接口 a(int),我们设置第一个期望: a 调用传入参数任意,调用次数任意;然后设置第二个期望: a 调用传入参数必须为1, 调用次数为2;当我们调用 a(1) 两次后,达到了第二个期望上边界

    2.1K20

    能向入口函数传入多个参数的 QueueUserWorkItem

    一个向仅有一个VOID*型回调函数传入任意多个任意类型参数的方法;InvocationShim; 一个推导函数调用约定以及函数摘要的方法;FnSynopsis、CallableSynopsis; 一个仿制的...exception_ptr *_ExceptionPtr; }; } /* QueueUserWorkItemEx QueueUserWorkItem 的扩展函数,可以任何可调用对象为入口,亦可向任务的入口函数传递任意多个任意类型的参数...参数: Flags,参见 QueueUserWorkItem 的 Flags 参数。 _Func,可调用对象。 Args,传递给可调用对象的参数包。...注意: 1、当Args参数包中参数数量不为零时会引起等待;等待线程池中线程调用_Func 前的参数拷贝完成。...beginthreadex、RegisterWaitForSingleObject、SetWaitableTimer、SetTimer等等等等都可像QueueUserWorkItemEx那样实现传递任意多个任意类型的参数

    1.3K20
    领券