提问人:lior.i 提问时间:12/17/2020 最后编辑:lior.i 更新时间:12/17/2020 访问量:1392
如何使用 Gmock 模拟没有运算符==的函数参数
How to mock a Function arguments with no operator== using Gmock
问:
我正在使用 Gmock 进行单元测试。 我有函数谁接收 protobuf 消息作为参数。 问题是,当我使用预期值测试函数时,它给了我一个缺少运算符==的错误。 我在这里发现了类似的问题 google-protocol-buffers-compare
class ClientReaderWriterMock : public ClientReaderWriterIf {
public:
virtual ~ClientReaderWriterMock() = default;
MOCK_METHOD1(Write, bool(const Msg&));
MOCK_METHOD1(Read, bool(Msg*));
};
TEST_F(controller_Test, receive_message) {
Msg msg;
.
.
.
EXPECT_CALL(*clientReaderWriterMockObj, Write(msg));
.
.
.
}
我收到以下错误:
###>/third_party/googletest/googletest/include/gtest/gtest-matchers.h:在'bool testing::internal::AnyEq::operator()(const)的实例化中 A&, const B&) const [with A = Msg;B = 消息]': /###>/third_party/googletest/googletest/include/gtest/gtest-matchers.h:549:18: 从'bool testing::internal::ComparisonBase<D, Rhs, Op>::Impl<Lhs, >::MatchAndExplain(Lhs, testing::MatchResultListener*) const [with Lhs = const Msg&; = 味精;D = testing::internal::EqMatcher; Rhs = 味精;Op = testing::internal::AnyEq]' /###>/third_party/googletest/googletest/include/gtest/gtest-matchers.h:547:10: 从这里开始需要 /###>/third_party/googletest/googletest/include/gtest/gtest-matchers.h:211:60: 错误:'operator==' 不匹配(操作数类型为“const Msg”和 'const Msg') 211 |bool 运算符()(const A& a, const B& b) const { 返回 a == b;} 在包含自 /###>/tests/unit/test.cpp:2: /###>/third_party/googletest/googletest/include/gtest/gtest.h:1535:13: 注意:候选者:'bool testing::internal::operator==(testing::internal::faketype, 测试::internal::faketype)' 1535 |内联布尔运算符==(faketype, faketype) { return true; /###>/third_party/googletest/googletest/include/gtest/gtest.h:1535:24: 注意:没有已知的参数 1 从“const Msg”到 '测试::内部::假类型' 1535 |内联布尔运算符==(faketype, faketype) { return true;
答:
当对具有某些参数的函数设置期望调用时,将(隐式)使用匹配器,因此该行:Eq
EXPECT_CALL(*clientReaderWriterMockObj, Write(msg));
实际上是:
EXPECT_CALL(*clientReaderWriterMockObj, Write(Eg(msg)));
Eq
匹配器将尝试调用(正如您所注意到的那样,它丢失了)。在这种情况下,您可以定义自己的匹配器:operator==
MATCHER_P(CustomMatcher, expected, "Msg doesn't match!") {
// your comparision code here
return arg.Field() == expected.Field();
}
[...]
EXPECT_CALL(*clientReaderWriterMockObj, Write(CustomMatcher(msg)));
评论