我在谷歌小组上问了这个问题,但我想我会在这里得到更快的回应。
我尝试使用Google's Mocking framework来测试我的代码。我也在使用他们的test framework。我在VC9中编译。我在匹配MFC\ATL CString的参数时遇到了问题。GMock说对象不相等,它似乎是在指针地址上求值。我尝试模拟的方法的结构如下:
void myMethod(const CString & key, const CString & value);
因此:
MOCK_METHOD2(myMethod, void(const CString & key , const CString &
value);
在设定我的期望时,我会进行以下比较:
CString szKey = _T("Some key");
CString szValue = _T("Some value");
EXPECT_CALL(myMock, myMethod(Eq(szKey), Eq(szValue))).WillOnce(Return
(true));
我尝试了许多不同的匹配器组合,如:
EXPECT_CALL(myMock, myMethod(StrCaseEq(_T("Some Key")), StrCaseEq(_T
(""Some value)))).WillOnce(Return(true));
EXPECT_CALL(myMock, myMethod(TypedEq<const CString &>(szKey),
TypedEq<const CString &>(szValue))).WillOnce(Return(true));
EXPECT_CALL(myMock, myMethod(TypedEq<const CString &>(szKey),
TypedEq<const CString &>(szValue))).WillOnce(Return(true));
以上任何一个调用都产生了相同的结果。还有人遇到过这个问题吗?
以下是输出:
Google Mock尝试了以下两种预期,但都不匹配:
:80: tried expectation #0
Expected arg #1: is equal to 006D430C pointing to "Some value"
Actual: 4-byte object <A8EF 1102>
Expected: to be called once
Actual: never called - unsatisfied and active
:83: tried expectation #1
Expected arg #1: is equal to (ignoring case) ""
Actual: 4-byte object <A8EF 1102>
Expected arg #2: is equal to (ignoring case) "Some value"
Actual: 4-byte object <C0EE 1102>
Expected: to be called once
Actual: never called - unsatisfied and active
亚当
2条答案
按热度按时间g2ieeal71#
既然在字符串传递给方法时并没有复制它们,那么你真的需要检查它们的值吗?写下面的期望就足够了:
...它将检查提供给mock方法的字符串是否确实是您所期望的(通过地址验证),而不是副本或其他字符串。
关于预封装的匹配器不能与
CString
一起工作的原因,我怀疑要么是因为CString
没有覆盖operator()==
,要么是因为匹配器实现没有CString
的显式专用化。o2g1uqev2#
结果是一个不同的错误。* 叹息 * 它实际上是抓住了一个错误....谷歌模拟可以比较cstring刚刚好。