当传递 gmock 对象作为参考时,设置期望不匹配 [重复]
Posted
技术标签:
【中文标题】当传递 gmock 对象作为参考时,设置期望不匹配 [重复]【英文标题】:When passing gmock object as reference the setup expectations doesnt match [duplicate] 【发布时间】:2021-04-29 19:55:31 【问题描述】:我想测试下一个类的行为。
class DAO
otl_connect *conn;
public:
DAO(otl_connect* _conn)
conn = _conn;
bool init()
bool ret = true;
try
conn->rlogon("ABC");
catch(otl_exception &e)
ret = false;
return ret;
;
为此,我从 otl_connect 创建了一个派生的模拟类;
class MockOtlConnect : public otl_connect
public:
MOCK_METHOD0(logoff, void());
MOCK_METHOD1(rlogon, void(const char *connect_str));
;
在我的测试中,它创建了对函数调用rlogon
的期望
TEST(TesteMockOtlConnect, MockingOtlConnect)
MockOtlConnect mock;
EXPECT_CALL(mock, rlogon("ABC"));
DAO dao(&mock);
EXPECT_TRUE(dao.init();
但这种期望永远不会得到满足。
Actual function call count doesn't match EXPECT_CALL(mock, rlogon("ABC"))...
Expected: to be called once
Actual: never called - unsatisfied and active
【问题讨论】:
被模拟的方法必须是virtual
,在this documentation中没有任何东西表明它们是virtual
。要么使用虚拟方法将其全部包装在您自己的包装类中,要么阅读有关在 GoogleMock cookbook 中模拟非虚拟方法的章节
【参考方案1】:
问题是匹配器错误。通过写作:
EXPECT_CALL(mock, rlogon("ABC"));
您不期望使用字符串"ABC"
调用rlogon
,但您期望使用您无法控制的某个指针值进行调用。
原因是你的参数类型是const char *
要修复它,请使用 StrEq()
匹配器。
EXPECT_CALL(mock, rlogon(StrEq("ABC")));
【讨论】:
我猜这两个问题都可能存在,当调用非虚拟函数和无法匹配参数时会打印相同的输出(尽管后者还提供了尝试过的期望的信息)。 godbolt.org/z/c1f78G8re以上是关于当传递 gmock 对象作为参考时,设置期望不匹配 [重复]的主要内容,如果未能解决你的问题,请参考以下文章