Я изучаю насмешки и с помощью googletest я создал класс MockServer, который должен издеваться над абстрактным классом IServer:
class IServer
{
virtual void writeData(QString buffer) = 0;
virtual QByteArray readData() = 0;
protected:
virtual ~IServer() = default;
};
class MockServer: public:: testing:: Test, public IServer
{
MOCK_METHOD(void, writeData, (QString buffer), (override));
MOCK_METHOD(QByteArray, readData, (), (override));
};
А теперь хочу протестировать другой класс, который его использует, однако я не могу инициализировать MockServer, потому что это абстрактный класс. Как это решить?
TEST_F(Serv_test, start)
{
?? MockServer mockServer; // <- how to declare it?
EXPECT_CALL(mockServer, writeData(testing::_)).Times(1);
EXPECT_CALL(mockServer, readData()).Return("testing");
Car car (nullptr, mockServer);
}
Вы путаете несколько вещей:
Вы используете тестовую фикстуру, но тестовая фикстура должна быть автономным классом. Вы смешиваете его со своим фиктивным классом. Для него нужно создать отдельный класс.
Класс Car
должен принимать параметр типа mock class (а не тестовое приспособление).
.Return
следует использовать внутри WillOnce
или WillRepeatedly
среди других мест. Вы не можете использовать его непосредственно на EXPECT_CALL
.
Я переписал ваш код следующим образом:
class IServer
{
public:
virtual void writeData(QString buffer) = 0;
virtual QByteArray readData() = 0;
protected:
virtual ~IServer() = default;
};
// Test fixture
class Serv_test : public ::testing::Test {
};
// Mock class
class MockServer: public IServer
{
public:
MOCK_METHOD(void, writeData, (QString buffer), (override));
MOCK_METHOD(QByteArray, readData, (), (override));
};
class Car{
public:
Car(int*, IServer* server):_server(server){
_server->writeData("testing");
_server->readData();
}
IServer* _server;
};
TEST_F(Serv_test, start)
{
MockServer mockServer; // <- how to declare it?
EXPECT_CALL(mockServer, writeData(testing::_)).Times(1);
EXPECT_CALL(mockServer, readData())
.WillOnce(testing::Return("testing"));
Car car (nullptr, &mockServer);
}
Рабочий пример здесь: https://godbolt.org/z/avsKdh37r