我在一个我inheritance的项目中有一个testing,看起来类似于这个
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之后,调用一个方法栏,它将原始string值作为参数,然后在方法中调用带有从原始string值构build的缓冲区的foo。
此testing正在使用此项目的Mac版本,但在Windows版本上失败。 它似乎是比较两个字符指针的指针地址,预期和实际,然后失败,因为它们是不同的。 foo的方法绝对是在bar内调用的。
如果这个testing方法(EXPECT_CALL)比较指针地址而不是指针处的数据,那么testing在Mac上也不应该失败?
无法使用for循环创build多个线程
gsoap wsdl2h在wcf wsdl文件上失败
指向共享内存段
接收到SIGSEGV信号后的处理行为?
是否有人熟悉使用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,_)... 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,_)... Expected: to be called once
预先感谢您的帮助。
如何启动具有特定访问权限的subprocess?
boost :: interprocess_mutex vs Win32 native mutexes的性能是什么?
Mac和Windows之间在EXPECT_CALL方面似乎没有任何明显的区别。 我想在string实现和编译器如何处理常量字符串之间也可能存在差异,这可以解释行为上的差异。
不过,我希望指针参数通过地址比较进行匹配。 要比较值,你应该使用特定的匹配器 。 特别是对于你的情况,有各种各样的字符串匹配器可供选择,包括用于字符串相等的StrEq ,你可以用它作为:
EXPECT_CALL(object,testing::StrEq(buffer),value.size(),_)) .WillOnce(Return(0));
这在Windows中的原因是因为MSVC实现字符串池( /GF )。 看这里:
http://msdn.microsoft.com/en-us/library/s0s0asdt.aspx
那么为什么这会使它工作? 因为gmock正在比较指针地址,当你有两个相同的常量字符串时,字符串池会使它们具有相同的值。 关闭这个编译器选项,看它失败。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。