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.