GTest 和 GoogleMock EXPECT_CALL 在 Windows 中失败,在 Mac 上通过 char * 参数

2023-12-19

我在继承的项目中有一个与此类似的测试

std::string value("test string");
const char * buffer = value.c_str();
EXPECT_CALL(object, foo(_,_,buffer, buffer.size(), _)).WillOnce(Return(0));
bar(value);

缓冲区是一个指向数据字符串的 char * 。我插入了像对象这样的虚拟值,只是为了关注似乎在使用 EXPECT_CALL 时出现的问题。在此 EXPECT_CALL 之后,将调用方法 bar,该方法将原始字符串值作为参数,然后在该方法中使用从原始字符串值构建的缓冲区调用 foo。

此测试在该项目的 Mac 版本上有效,但在 Windows 版本上失败。它似乎正在比较两个 char 指针的指针地址(预期的和实际的),然后失败,因为它们不同。方法 foo 肯定是在 bar 中调用的。

如果此测试方法 (EXPECT_CALL) 比较指针地址而不是该指针处的数据,那么测试在 Mac 上是否也会失败?

有人熟悉使用 EXPECT_CALL 和指针时 Mac 和 Windows 之间的明显区别吗?

我看到的错误

unknown file: error:
Unexpected mock function call - returning default value.
    Function call: foo(NULL, 1, 0000000001CAAE78 pointing to "test string", 11,_)
           Returns: 0
Google Mock tried the following 1 expectation, but it didn't match:

test.cpp(235): EXPECT_CALL(object, foo(_,_,buffer,buffer.size(),_)...
  Expected arg #2: is equal to 0000000001CAAF78 pointing to "test string"
           Actual: 0000000001CAAE78 pointing to "test string"
         Expected: to be called once
           Actual: never called - unsatisfied and active
   test.cpp(235): error: Actual function call count doesn't match EXPECT_CALL(object, foo(_,_,buffer, buffer.size(), _)...
     Expected: to be called once

我修改了这个错误只是为了反映我的例子。

预先感谢您的帮助。


对于 EXPECT_CALL,Mac 和 Windows 之间似乎没有任何明显的差异。我想之间也可能存在差异string实现,以及编译器如何处理常量字符串,这可以解释行为的差异。

但是,我希望指针参数通过地址比较来匹配。要比较值,您应该使用特定的Matchers https://code.google.com/p/googlemock/wiki/CheatSheet#Matchers。特别是对于您的情况,有多种字符串匹配器 https://code.google.com/p/googlemock/wiki/CheatSheet#String_Matchers可供选择,包括StrEq对于字符串相等,您可以将其用作:

EXPECT_CALL(object, foo(_,_,testing::StrEq(buffer),value.size(),_))
  .WillOnce(Return(0));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GTest 和 GoogleMock EXPECT_CALL 在 Windows 中失败,在 Mac 上通过 char * 参数 的相关文章

  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • 如何从页眉和/或页脚确定 PE 可执行文件的大小

    假设您有要雕刻的数据流或字节块 如何确定可执行文件的大小 PE 可执行文件格式中有许多标头 但是我使用哪些标头部分来确定 如果可能 可执行文件的总长度 这是文件格式的图片 如果PE文件格式良好 计算可以简化为 伪代码 size IMAGE
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • win32 GUI 应用程序在作为“app.exe --help”调用时将使用文本写入标准输出

    如何创建执行以下操作的 Windows 应用程序 当不使用命令行参数调用时 它是一个常规的 GUI 应用程序 指定可选的 help 命令行参数会导致应用程序将使用文本写入标准输出 然后终止 它必须是单个可执行文件 让控制台应用程序执行第二个
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 在 MacO 和 Linux 上安装 win32com [重复]

    这个问题在这里已经有答案了 我的问题很简单 我可以安装吗win32com蟒蛇API pywin32特别是 在非 Windows 操作系统上 我一直在Mac上尝试多个版本pip install pywin32 都失败了 下面是一个例子 如果你
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co

随机推荐