我是第一次使用 Google Mock (gMock)。给出以下代码片段:
class LinkSignals
{
public:
virtual ~LinkSignals() { }
virtual void onLink(std::string) = 0;
virtual void onUnLink() = 0;
};
class MockLinkSignals : public LinkSignals
{
public:
MOCK_METHOD1(onLink, void(std::string));
MOCK_METHOD0(onUnLink, void());
};
MockLinkSignals mock_signals;
当我执行一些导致
EXPECT_CALL(mock_signals, onLink(_))
运行的测试代码时,如何检查 onLink()
的参数?
您通常会使用现有的 gmock 匹配器或定义自己的匹配器来检查传递给模拟方法的参数。
例如,使用默认的 Eq 相等匹配器:
EXPECT_CALL(mock_signals, onLink("value_I_expect"))
或者检查子字符串说:
EXPECT_CALL(mock_signals, onLink(HasSubstr("contains_this")))
gmock 文档提供了可用的标准匹配器的详细信息,还描述了如何创建自定义匹配器,例如整数参数类型:
MATCHER(IsEven, "") { return (arg % 2) == 0; }
可以通过将操作附加到期望来捕获变量的参数,尽管这在期望范围内的用途有限:
EXPECT_CALL(mock_signals, onLink(_)).WillOnce(SaveArg<0>(pointer))
我建议在为您的特定案例选择最佳方法之前研究各种可用的匹配器和操作。
SaveArg<N>(pointer)
之外,我认为使用lambda表达式更容易理解为什么匹配失败。
class MockFoo : public Foo {
public:
MOCK_METHOD(void, output, (FILE * handle, const char* msg), (override));
};
我在匹配
msg
参数时遇到了一些困难(handle
无趣),所以我这样做了:
MockFoo mockFoo;
// This has to be the _first_ expectation in the test
EXPECT_CALL(mockFoo, output(_, _))
.WillRepeatedly([](FILE* handle, const char* msg) {
std::string s = msg;
std::cout << "In lambda! msg = " << s << std::endl;
});
EXPECT_CALL(mockFoo, output(_, testing::StrCaseEq("bar!")))
.Times(1);
第一个
EXPECT_CALL
将留下一个操作,该操作将打印与任何其他期望不匹配的任何消息,并且它必须是要设置的第一个期望(此处的顺序很重要)。然后像往常一样添加其他期望即可。