google mock : error: ‘class ISInfo’ has no member named ‘gmock_registerCallBack’
google mock : error: ‘class ISInfo’ has no member named ‘gmock_registerCallBack’
我在 C++ 中有一个名为 SInfo 的接口
class ISInfo
{
public:
/// Register a callback
virtual Handle registerCallBack( const std::string topic) = 0;
/// De-register a callback
virtual bool deregisterCallback(Handle handle) = 0;
/// Deconstructor
virtual ~ISInfo()
{
};
};
我有 class 实现 ISInfo
的 MSInfo
class MSInfo : public ISInfo
{
public:
/// Constructor
MSInfo( Node *Node);
/// Deconstructor
~MSInfo();
/// Register a callback
Handle registerCallBack( const std::string topic);
/// Deregister
bool deregisterCallback(Handle handle);
};
我创建了一个名为 MockMSInfo 的 Mock class,如下所示。
class MockMSInfo : public MSInfo
{
public:
MockMSInfo(Node *node) : MSInfo(ode) {}
MOCK_METHOD1(registerCallBack, Handle(const std::string topic));
MOCK_METHOD1(deregisterCallback, bool(Handle topicHandle));
};
在我的单元测试中,我创建了一个上述类型的模拟对象MockMSInfo
如下
Node *node = new Node();
ISInfo *isInfo = new MockMSInfo(node);
问题是我什么时候做
EXPECT_CALL(*isInfo, registerCallBack(_));
我收到以下错误
googletest/install/include/gmock/gmock-spec-builders.h:2026:16: error: ‘class ISInfo’ has no member named ‘gmock_registerCallBack’
((mock_expr).gmock_##call)(::testing::internal::GetWithoutMatchers(), \
^
googletest/install/include/gmock/gmock-spec-builders.h:2034:3: note: in expansion of macro ‘GMOCK_ON_CALL_IMPL_’
GMOCK_ON_CALL_IMPL_(obj, InternalExpectedAt, call)
^
MonitorUnitTests.cpp:52:5: note: in expansion of macro ‘EXPECT_CALL’
EXPECT_CALL(*isInfo, registerCallBack(_));
对于初学者:我建议你从基础 class 派生,而不是从 impl class:
class MockMSInfo : public ISInfo
{
public:
MOCK_METHOD1(registerCallBack, Handle(const std::string topic));
MOCK_METHOD1(deregisterCallback, bool(Handle topicHandle));
};
现在是实际问题:编译器是您的朋友。事实上,您想调用 IsInfo
中不可用的方法。看,你已经创建了一个 MockMSInfo
的实例,但是你已经将它分配给了基 class(即 ISInfo *
)的 ptr。宏 MOCK_METHOD*
为 mock class 添加了一个新方法(当然,不是基础 class!),称为 gmock_<METHOD_NAME>
.并且 EXPECT_CALL
要求在传递的 class 中定义此类方法。但是你通过了ISInfo *
。因此,要解决此问题,只需创建模拟并使用 MockMSInfo *
作为类型。工作示例 https://godbolt.org/z/Pe8eM9E9s.
我在 C++ 中有一个名为 SInfo 的接口
class ISInfo
{
public:
/// Register a callback
virtual Handle registerCallBack( const std::string topic) = 0;
/// De-register a callback
virtual bool deregisterCallback(Handle handle) = 0;
/// Deconstructor
virtual ~ISInfo()
{
};
};
我有 class 实现 ISInfo
的 MSInfoclass MSInfo : public ISInfo
{
public:
/// Constructor
MSInfo( Node *Node);
/// Deconstructor
~MSInfo();
/// Register a callback
Handle registerCallBack( const std::string topic);
/// Deregister
bool deregisterCallback(Handle handle);
};
我创建了一个名为 MockMSInfo 的 Mock class,如下所示。
class MockMSInfo : public MSInfo
{
public:
MockMSInfo(Node *node) : MSInfo(ode) {}
MOCK_METHOD1(registerCallBack, Handle(const std::string topic));
MOCK_METHOD1(deregisterCallback, bool(Handle topicHandle));
};
在我的单元测试中,我创建了一个上述类型的模拟对象MockMSInfo
如下
Node *node = new Node();
ISInfo *isInfo = new MockMSInfo(node);
问题是我什么时候做
EXPECT_CALL(*isInfo, registerCallBack(_));
我收到以下错误
googletest/install/include/gmock/gmock-spec-builders.h:2026:16: error: ‘class ISInfo’ has no member named ‘gmock_registerCallBack’
((mock_expr).gmock_##call)(::testing::internal::GetWithoutMatchers(), \
^
googletest/install/include/gmock/gmock-spec-builders.h:2034:3: note: in expansion of macro ‘GMOCK_ON_CALL_IMPL_’
GMOCK_ON_CALL_IMPL_(obj, InternalExpectedAt, call)
^
MonitorUnitTests.cpp:52:5: note: in expansion of macro ‘EXPECT_CALL’
EXPECT_CALL(*isInfo, registerCallBack(_));
对于初学者:我建议你从基础 class 派生,而不是从 impl class:
class MockMSInfo : public ISInfo
{
public:
MOCK_METHOD1(registerCallBack, Handle(const std::string topic));
MOCK_METHOD1(deregisterCallback, bool(Handle topicHandle));
};
现在是实际问题:编译器是您的朋友。事实上,您想调用 IsInfo
中不可用的方法。看,你已经创建了一个 MockMSInfo
的实例,但是你已经将它分配给了基 class(即 ISInfo *
)的 ptr。宏 MOCK_METHOD*
为 mock class 添加了一个新方法(当然,不是基础 class!),称为 gmock_<METHOD_NAME>
.并且 EXPECT_CALL
要求在传递的 class 中定义此类方法。但是你通过了ISInfo *
。因此,要解决此问题,只需创建模拟并使用 MockMSInfo *
作为类型。工作示例 https://godbolt.org/z/Pe8eM9E9s.