GTest和GoogleMock EXPECT_CALL在窗口中失败,在Mac上通过char*param
GTest and GoogleMock EXPECT_CALL Fails in windows, passes on Mac with char * param
我继承的一个项目中有一个测试,看起来与这个相似
std::string value("test string");
const char * buffer = value.c_str();
EXPECT_CALL(object, foo(_,_,buffer, buffer.size(), _)).WillOnce(Return(0));
bar(value);
缓冲区是一个指向数据字符串的char*。我插入了像object这样的伪值,只是为了关注EXPECT_CALL使用中的问题。紧接在EXPECT_CALL之后,将调用一个方法栏,该方法栏将原始字符串值作为参数,然后在该方法内调用带有根据原始字符串值构建的缓冲区的foo。
此测试适用于此项目的Mac版本,但在Windows版本上失败。它似乎在比较两个字符指针(预期指针和实际指针)的指针地址,然后因为它们不同而失败。方法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
我修改了这个错误只是为了反映我的例子。
提前感谢您的帮助。
Mac和amp;关于EXPECT_CALL的Windows。我想string
实现和编译器处理常量字符串的方式之间也可能存在差异,这可以解释行为上的差异。
不过,我希望通过地址比较来匹配指针参数。要比较值,您应该使用特定的Matchers。特别是对于您的情况,有多种字符串匹配器可供选择,包括用于字符串相等的StrEq
,您可以将其用作:
EXPECT_CALL(object, foo(_,_,testing::StrEq(buffer),value.size(),_))
.WillOnce(Return(0));
这在Windows中有效的原因是MSVC实现了字符串池(/GF
)。请参阅此处:
http://msdn.microsoft.com/en-us/library/s0s0asdt.aspx
那么,为什么这能让它发挥作用呢?因为gmock正在比较指针地址,当您有两个相同的常量字符串时,字符串池将导致它们具有相同的值。关闭此编译器选项并观察其失败。
- 在没有Xcode的情况下在Mac捆绑包中嵌入框架
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 如何使用CLion在Mac上创建一个新的.txt文件
- 如何使用Clang/GCC在Mac上为C/C++设置VSCode
- 在 Mac 上使用 CMAKE 将 FFTW 和 FFTWPP 链接到项目中时未定义的符号
- 有人安装"IITB Simplecpp in mac"吗?
- libprotobuf 检查在 Mac OS 上执行程序时失败
- 如何在 Mac 上使用 c++17 并行标准库算法?
- 在 Mac 上的 python 上提升
- 我可以在 iOS 或 mac 应用程序中使用C++代码吗?
- 如何在 Mac 上正确编译C++,当它在 Linux 上编译没有问题时?
- C++读取用户输入而不按回车键(Mac OS X),与Turbo Pascal中的读取键相同
- 如何在 MAC OS c/c++ 中阻止 USB 存储设备
- 编译在我的 Mac 上工作,但在集群 (Linux) 上不起作用
- 在装有 CLion 的 Mac 上使用 C++ 连接到 MySQL 数据库时出现问题
- 动态获取 esp32 的 mac 地址并在以太网库中使用它.
- GDB 断点在 Mac 上是不准确的
- 各种版本的 Mac OSX 向后兼容性如何?(Xcode C++
- 无法识别 Mac c++ 文件系统库
- GTest和GoogleMock EXPECT_CALL在窗口中失败,在Mac上通过char*param