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

如何在gmock expect_call中对结构参数进行部分匹配

在Google Mock(gMock)中,EXPECT_CALL宏用于设置对模拟对象的方法调用的期望。如果你想要对结构参数进行部分匹配,可以使用testing::Matcher来实现灵活的匹配策略。

以下是一个使用gMock对结构参数进行部分匹配的例子:

代码语言:txt
复制
#include "gmock/gmock.h"
#include "gtest/gtest.h"

// 假设有一个结构体
struct MyStruct {
    int a;
    std::string b;
    double c;
};

// 假设有一个接口
class MyInterface {
public:
    virtual ~MyInterface() {}
    virtual void MyMethod(const MyStruct& s) = 0;
};

// 使用gMock创建模拟对象
class MockMyInterface : public MyInterface {
public:
    MOCK_METHOD(void, MyMethod, (const MyStruct& s), (override));
};

TEST(MyTest, PartialMatch) {
    MockMyInterface mock;

    // 设置期望,只匹配a和b字段
    EXPECT_CALL(mock, MyMethod(testing::Field(&MyStruct::a, 1)))
        .Times(1)
        .WillOnce([](const MyStruct& s) {
            // 这里可以添加断言或其他逻辑来验证s.b的值
            EXPECT_EQ(s.b, "expected_value");
        });

    // 调用方法,传入一个部分匹配的参数
    MyStruct s1 = {1, "expected_value", 3.14};
    MyStruct s2 = {1, "unexpected_value", 3.14};
    mock.MyMethod(s1); // 应该匹配
    mock.MyMethod(s2); // 不应该匹配
}

int main(int argc, char **argv) {
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

在这个例子中,我们使用了testing::Field来指定我们只关心结构体中的某些字段。EXPECT_CALL宏中的testing::Field(&MyStruct::a, 1)表示我们只关心MyStruct中的a字段等于1的情况。

优势

  • 灵活性:使用testing::Matcher可以实现对结构参数的灵活匹配,而不仅仅是完全匹配。
  • 可读性:代码清晰地表达了测试的意图,易于理解和维护。

类型

  • 部分匹配:只匹配结构体中的某些字段。
  • 完全匹配:要求结构体的所有字段都匹配。

应用场景

  • 当你只想验证结构体中的某些字段是否符合预期时。
  • 当结构体很大,但你只关心其中的一部分字段时。

遇到的问题及解决方法

如果你在EXPECT_CALL中对结构参数进行部分匹配时遇到问题,可能是因为以下原因:

  1. 字段访问错误:确保你正确地使用了testing::Field来访问结构体的字段。
  2. 匹配器使用错误:确保你使用的匹配器(如testing::Field)是正确的,并且参数类型匹配。
  3. 调用顺序错误:确保EXPECT_CALL设置的期望顺序与实际调用顺序一致。

解决方法

  • 检查字段访问语法是否正确。
  • 确保匹配器的使用符合预期。
  • 使用TimesWillOnce等方法来控制期望的调用次数和行为。

通过以上方法,你可以灵活地在gMock中对结构参数进行部分匹配,从而实现更精确的单元测试。

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

相关·内容

Google Mock(Gmock)简单使用和源码分析——源码分析

这样它便将函数返回类型和参数进行了拆分。并别名了各个类型,从而方便在之后模板忽略具体类型。        ...这样将参数放到一个元组对象,是InvokeWith方法不同个数、不同类型、不同顺序的参数调用实现统一化处理。...2的函数是使用gmock和函数名联合组装成的新函数名,它返回了一个被参数筛选的函数对象。EXPECT_CALL和ON_CALL宏中就是调用了它。...}         这个函数,还有extra_matcher_这种参数匹配规则。...EXPECT_CALL宏和WillOnce、WillRepeatedly等方法,设定了函数对象的一些特性。 最终用户调用函数时,将通过参数匹配得到适合的函数对象,并执行该函数对象的预期行为。

4.3K20
  • CC++生态工具链——接口模拟工具gmock

    gmock可以快速轻松地定义模拟对象,模拟对象提供与真实对象相同的接口。gmock允许开发者定义模拟对象的行为,例如调用哪些方法,以什么顺序,调用多少次,传哪些参数,返回什么样的值等等。...四,gmock的主要特性 1.提供了用于定义模拟行为的声明性语法。 2.支持任意类型的函数或被重载的函数进行模拟。 3.拥有丰富的匹配器,用于验证函数参数。...)); MOCK_METHOD(ReturnType, MethodName, (Args...), (Specs...)); }; 前3个参数包含: 函数返回类型,函数名,函数传参。...第4个参数(Specs)为限定符: const——重写const方法时需要带上 override——覆盖virtual方法时需要带上 noexcept——重写noexcept方法时需要带上 b.定义预期行为...,EXPECT_CALL为例: EXPECT_CALL(mock_object, method(matcher1, matcher2, ...)) .With(multi_argument_matcher

    2.7K30

    Google Mock(Gmock)简单使用和源码分析——简单使用

    初识Gmock是之前分析GTest源码时,它的源码和GTest源码在同一个代码仓库(https://github.com/google/googletest)。...但是这个时候别人的模块可能还没完成,那么我们就需要模拟约定的接口进行自测。Gmock就是一个强大的模拟接口的工具。 使用方法         首先我们讲解一下其主要的使用方法。...Method是mock对象的mock方法,它的参数可以通过argument-matchers规则去匹配。 With是多个参数匹配方式指定。 Times表示这个方法可以被执行多少次。...它是通过同一序列声明期待的顺序确定的。 After方法用于指定某个方法只能在另一个方法之后执行。 WillOnce表示执行一次方法时,将执行其参数action的方法。...第5行意思是Login操作一直返回false,其中Login的参数是两个下划线(_),它是通配符,就是任何输入参数都按之后要求执行。第6行意思是Pay操作总是返回true。

    7.8K21

    gtest整理_softest

    [-NEGATIVE_PATTERNS] ::testing::FLAGS_gtest_filter(std::string) 执行的测试案例进行过滤,支持通配符: ?...内的参数意义 mock_object表示Mock类的对象(mock) method表示Mock的方法(Func) matcher是匹配器,可以用于定义函数方法参数的值,也可以判断输入的参数是否符合匹配器...,匹配器给出的功能与断言类似,名称也很像,下面只列出其中一部分,可以参考gtest和gmock的文档。...),可以注意到 ::testing::Lt() 其实就是上面的匹配器,使用在.With时,不需要填参数。...但是如果我们只希望部分函数按照顺序执行而不关心其他部分的顺序呢,可以定义多个 Sequence 类型对象,所有调用 .InSequence 的 EXPECT_CALL 都将按照声明的顺序调用,上代码。

    1.4K20

    C++雾中风景番外篇2:Gtest 与 Gmock,聊聊C++的单元测试

    安装 Gtest 和 GMock 十分简单: sudo apt-get install libgtest-dev libgmock-dev 其他发行版:Ubuntu,Centos 应该也可以通过自带的包管理软件就可以完成安装了...--gtest_filter 所执行的测试进行过滤,支持通配符 ? 单个字符 * 任意字符 - 排除 ....所以这时就需要引入 Mock Objects (模拟对象)来模拟程序的一部分来构造测试场景。Mock Object模拟了实际对象的接口,通过一些简单的代码模拟实际对象部分的逻辑,实现起来简单很多。...这里要引出本章的主角 Gmock 了,接下来笔者将编写一个简要的 Mock对象并进行单元测试,来展示一下 GMock 的用法。...这里我们用到了宏定义 MOCK_METHOD,后面的数字代表了模拟函数的参数个数,MOCK_METHOD0,MOCK_METHOD1。它接受两个参数参数1,方法名称。

    4.5K51

    gtest和gmock的关系_gtest教程

    注:如果不用gmock,仅仅用到gtest,可以将上述gmock部分内容去掉。 对于 c++ 来说写单元测试和 mock 框架不是一件容易的事情。...“Fixture”是一个汉语不易直接对应的词,《美国传统词典》它的解释是“(作为附属物的)固定装置;被固定的状态”。...,可以利用特定的函数返回值、函数的输出(outbound)参数、或者设置全局变量(C标准库定义的 errno,Windows API的“上次错误”(last error)代码,Winsock与每个...四、值参数化测试 有些时候,我们需要对代码实现的功能使用不同的参数进行测试,比如使用大量随机值来检验算法实现的正确性,或者比较同一个接口的不同实现之间的差别。...熟悉C++的读者应该知道,模板函数在进行类型推断(deduction)时匹配相当严格,不像普通函数那样允许类型提升(promotion)。如果上面省略 u后缀,就会造成编译错误。

    1.8K20

    面向 C++ 的现代 CMake 教程(三)

    ODR 是一个 C++概念,但我们已经知道,链接器进行了严格的实施。在介绍了这个主题之后,我们简要探讨了如何在静态和动态库处理最基本的符号重复。...在下一章,我们将学习如何在 CMake 管理依赖关系。...既然我们已经知道如何在一个适当的目标结构一个可测试的项目,那么让我们将重点转移到测试框架本身。我们不想手动将每个测试用例添加到我们的列表文件吧?...在我们的测试用例,我们rng_mock_的Get()方法调用 GMockEXPECT_CALL宏。这告诉框架,如果在执行过程没有调用Get()方法,则测试失败。...开始使用 GMock 的一个好地方是官方文档的Mocking for Dummies页面(你可以在进阶阅读部分找到这个链接)。

    39700

    Sonar Scanner 之 C++扫码篇

    扫描内容 一般来讲,我们主要是代码进行静态扫描,如果有执行单元测试或者集成测试的话,可以把测试结果以及覆盖率统计结果也一并扫描并上报给SonarQube服务器。...覆盖率检测这项工作除了简单的代码插桩--用例执行--结果获取这几步之外,实际的工程还存在更为复杂的场景,收集分布式系统或者是多环境并行执行测试的结果,这需要对多个执行结果进行合并。...又例如需要知道增量覆盖的情况, 需要基于之前的覆盖率结果,现有结果进行减法,得到增量部分。...支持C/C++多种编码标准 支持windows/Linux 提供了多种传感器: cppcheck/gcc/valgrind等等 提供了单元测试/覆盖率数据的分析功能 还支持自定义扩展规 部署-sonar-cxx...工作过程 一个典型的过程是: 部署上述工具,形成标准化的编译扫码环境 从代码库检出代码,并转换到相应的分支 通过cppcheck进行代码扫码 通过make进行gcc编译,编译过程通过gccv进行插桩

    7.3K50

    面向 C++ 的现代 CMake 教程(五)

    我们将添加对 CTest 的支持,并适当结构我们的项目以进行测试(我们将应用前面提到的main()分离)。...让我们继续进行配置的最后部分——打包。...我们将从第十章《生成文档》中介绍的代码汲取灵感,并进行修改以支持许多目标: chapter-12/01-full-project/cmake/Doxygen.cmake(继续) function(...我们解释了 CMake 的语法:注释,命令调用,参数,变量和控制结构。我们发现了模块和子项目是如何工作的,正确的项目结构是什么,以及如何与各种平台和工具链一起工作。...您可以使用捕获组将匹配项添加到带有数字占位符\\1、\\2…的表达式:(需要使用双反斜杠,以便正确解析参数)。

    11300

    基于 hook 和 gmock 开展单元测试

    15左右,这类接口,不建议做UT,最好的方法是让开发进行优化,降低函数的圈复杂度。...结合SDK实际情况,整合gtest和gmock框架至测试分支,如下图2所示: 图2代码组织结构 这里的UT是嵌入到开发工程里的,做为开发源码WorkSpace的一个target,该target和之前...即被测类A和mock类B之间没有任何关系,mock类B同样实现了被测类A的大部分接口,在测试代码,通过声明mock类B的对象,来达到测试目的。...Linux上的hook和windows上的原理差不多,操作基本上是目标函数进行劫持,替换成自己的函数,然后在自己的函数中进行一些用户预期的操作,比如修改函数返回值等。...综合考虑后,决定在Linux系统进行导航引擎的单测。百度以及公司内部都基于hook以及gmockgtest进行了二次封装,形成了自己的单元测试框架btest和ttest。

    5.4K30

    【C++】异常

    时,需要跟throw抛出对象类型 进行匹配 :此时的throw传过来的是字符串,所以catch 用const char*接收 由于有捕获异常,所以当再次b为0时,就不会报错了,显示的详细信息为Division...try和catch 两者是配对的, catch 只能捕获 try里面的抛的异常 :在主函数的catch 捕获异常只能 捕获 Func函数抛的异常 ---- 情况2 被选中的处理代码是调用链与该对象类型匹配且离抛出异常位置最近的那一个...,任意类型异常进行捕获 防止一些异常没有捕获(没有对象类型匹配),导致程序终止 ---- 规则4 抛出异常对象后,会生成一个异常对象的拷贝,因为抛出的异常对象可能是一个临时对象, 所以会生成一个拷贝对象...很多的第三方库都包含异常,比如boost、gtest(单元测试)、gmock(打桩测试)等等常用的库,那么我们使用它们 也需要使用异常 ---- 4....部分函数使用异常更好处理,比如构造函数没有返回值,不方便使用错误码方式处理。

    17930

    2020年7月7日 Go生态洞察:保持模块兼容性

    第1部分 — 使用Go模块 第2部分 — 迁移到Go模块 第3部分 — 发布Go模块 第4部分 — Go模块:v2及以后 第5部分 — 保持模块兼容性(本文) 我们将深入探讨如何在不破坏现有用户代码的前提下...,Go模块进行迭代和升级。..., args ...interface{}) (*Rows, error) 若未来函数可能需要更多参数,可以预先通过单一结构参数进行设计,crypto/tls.Dial的做法。...例如json.Decoder添加的Decoder.DisallowUnknownFields方法。 维护结构体兼容性 ️ 向导出的结构体添加字段通常是向后兼容的,但要确保新字段的零值具有意义。...总结 在设计API时,要考虑其未来变化的扩展性。当需要添加新功能时,遵循“添加而不是更改或删除”的原则,除了接口、函数参数和返回值外,这些通常不能以向后兼容的方式添加。

    10410

    C++异常处理机制

    系统的很多库的接口函数都是通过把错误码放到errno,表示错误。 实际C语言基本都是使用返回错误码的方式处理错误,部分情况下使用终止程序处理非常严重的错误。...首先检查throw本身是否在try块内部,如果是再查找匹配的catch语句。如果有匹配的,则调到catch的地方进行处理。 7....没有匹配的catch则退出当前函数栈,继续在调用函数的栈中进行查找匹配的catch。 8. 如果到达main函数的栈,依旧没有匹配的,则终止程序。...它们是以父子类层次结构组织起来的,如下所示: 说明:实际我们可以可以去继承exception类实现自己的异常类。但是实际很多公司像上面一样自己定义一套异常继承体系。...很多的第三方库都包含异常,比如boost、gtest、gmock等等常用的库,那么我们使用它们也需要使用异常 部分函数使用异常更好处理,比如构造函数没有返回值,不方便使用错误码方式处理。

    1500

    【C++高阶】深入理解C++异常处理机制:从try到catch的全面解析

    前言:在编程的浩瀚宇宙,C++以其卓越的性能、强大的灵活性和底层硬件的直接控制而著称,是无数开发者心中的瑰宝。然而,在追求高效与极致的路上,错误处理与异常管理往往成为不可忽视的重要环节。...系统的很多库的接口函数都是通 过把错误码放到errno,表示错误 实际C语言基本都是使用返回错误码的方式处理错误,部分情况下使用终止程序处理非常严重的 错误 C++异常概念 异常是一种处理错误的方式...如果有匹配的,则 调到catch的地方进行处理 没有匹配的catch则退出当前函数栈,继续在调用函数的栈中进行查找匹配的catch 如果到达main函数的栈,依旧没有匹配的,则终止程序。...很多的第三方库都包含异常,比如boost、gtest、gmock等等常用的库,那么我们使用它们 也需要使用异常 部分函数使用异常更好处理,比如构造函数没有返回值,不方便使用错误码方式处理。...这三个关键字来构建异常处理的框架,理解了异常如何在程序传播,并掌握了如何通过捕获和处理异常来避免程序崩溃和数据丢失的风险。

    41310
    领券