Compilation 使用抽象基类引用在GoogleMock中调用函数时出现num参数错误

Compilation 使用抽象基类引用在GoogleMock中调用函数时出现num参数错误,compilation,mocking,googletest,googlemock,Compilation,Mocking,Googletest,Googlemock,我对google mock EXPECT_CALL宏有一个问题。 以下代码给出EXPECT\u CALL语句的编译错误: 错误C2660:“testing::Eq”:函数不接受1个参数 \gmock-1.6.0\include\gmock\gmock matchers.h 基本上,我有一个基本容器和该容器的基本数据对象,包括抽象和缓存,缓存有一个指向基本容器的指针和一个引用基本数据对象的Add方法。我创建了一个基本程序来演示这个问题。如果有人能帮忙,非常感谢 #include "gtest/gt

我对google mock EXPECT_CALL宏有一个问题。 以下代码给出EXPECT\u CALL语句的编译错误:

错误C2660:“testing::Eq”:函数不接受1个参数 \gmock-1.6.0\include\gmock\gmock matchers.h

基本上,我有一个基本容器和该容器的基本数据对象,包括抽象和缓存,缓存有一个指向基本容器的指针和一个引用基本数据对象的Add方法。我创建了一个基本程序来演示这个问题。如果有人能帮忙,非常感谢

#include "gtest/gtest.h"
#include "gmock/gmock.h"

namespace
{
class BaseData
{
    public:
    virtual void SetValue(const int value) = 0;
};

class BaseContainer
{ 
    public:
    virtual void Add(const BaseData& data) = 0;
};



class MockContainer : public BaseContainer
{
public:
    MOCK_METHOD1(Add, void (const BaseData& data));
};

class MockData : public BaseData
{
public:
    MOCK_METHOD1(SetValue, void (int));
};

class Cache
{
    private:
    BaseContainer* container;
    public:
    Cache(BaseContainer* c)
    {
        container = c;
    }
    ~Cache()
    {
    }

    void AddToContainer(const BaseData& data)
    {
        container->Add(data);
    }
};

class CacheTestFixture : public ::testing::Test
{
protected:
    CacheTestFixture() {}

    virtual ~CacheTestFixture() {}

    virtual void SetUp() {}

    virtual void TearDown() {}

};

TEST_F(CacheTestFixture, TestAdd)
{
    MockData data;
    MockContainer container;
    EXPECT_CALL(container, Add(data)).WillRepeatedly(::testing::Return());
    Cache c(&container);
    ASSERT_NO_THROW(c.AddToContainer(data));
}
}

int _tmain(int argc, _TCHAR* argv[])
{
::testing::InitGoogleMock(&argc, argv);

return RUN_ALL_TESTS();
}

您需要使用
::testing::Eq(ByRef(data))
::testing::Eq
是需要使用的匹配器,请在上阅读有关匹配器的信息


要将模拟实现作为基类引用发送,
testing::Eq
需要在抽象基类上实现
=
运算符,这是不可取的。

黑洞的答案是正确的,您必须使用

::testing::Eq(ByRef(data))
但是为了获得正确的copmarison,您必须为BaseData定义运算符==,因为它是一个抽象类。您可以在测试代码中作为免费函数执行此操作:

bool operator==(const BaseData& left, const BaseData& right)
{
    return ...;
}

我曾经问过一个类似的问题,请看

,我也试过,但这并不能解决问题。如果我这样做,我仍然会得到错误:“bool testing::internal::operator=(T*,const testing::internal::linked_ptr&”):无法从“const BaseData”推断出“T*”的模板参数只是一个问题-用于
SetValue
MOCK_方法是否需要
const int
而不是
int
bool operator==(const BaseData& left, const BaseData& right)
{
    return ...;
}