2013-09-17 2 views
3

У меня проблема с макросом макросов EXPECT_CALL. Следующий код дает ошибку компиляции на EXPECT_CALL Заявление:Вызов функции в google mock с ссылкой на абстрактный базовый класс дает num аргументы error

error C2660: 'testing::Eq' : function does not take 1 arguments \gmock-1.6.0\include\gmock\gmock-matchers.h

В принципе у меня есть базовый контейнер и базовый объект данных для этого контейнера, как абстрактные и кэш, который имеет указатель на базовый контейнер и способ добавить, что берет ссылку на базовый объект данных. Я создал базовую программу для демонстрации проблемы. Большое спасибо, если кто-то может помочь.

#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(); 
} 
+0

Только вопрос - бы 'MOCK_METHOD' для' 'SetValue' требует константного int' а не просто 'int'? – dwanderson

ответ

7
EXPECT_CALL(container, Add(testing::Ref(data))).WillRepeatedly(::testing::Return()); 

Чтобы отправить фиктивный реализацию в качестве ссылки на базовый класс, testing::Eq потребует == оператора должны быть реализованы на абстрактный базовый класс, который не является желательным.

2

Вы должны использовать ::testing::Eq(ByRef(data)) ::testing::Eq является Сличитель, который должен быть использован, читать о matchers на Google Mock Cookbook.

+0

Пробовал это тоже, это не проблема. Если я это сделаю, я все равно получаю ошибку: 'bool testing :: internal :: operator == (T *, const testing :: internal :: linked_ptr &)': не удалось вывести шаблон аргумент для 'T *' из 'const BaseData' – Sahil

0

Ответ от Blackhole правильно, вы должны использовать

::testing::Eq(ByRef(data)) 

Но для того, чтобы правильного copmarison вы должны определить оператор == для BaseData, так как он является абстрактным классом. Вы можете сделать это в вашем коде тестирования в качестве бесплатной функции:

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

Однажды я задал подобный вопрос, см here

Смежные вопросы