Внедрение объекта gmock - PullRequest
0 голосов
/ 02 мая 2019

В образовательных целях я пишу игру на Pacman, похожую на Qt и C ++.Основная часть игры работает корректно, но теперь мне нужно протестировать ее с фреймворком Googletest.Я прочитал о внедрении зависимостей и попытался внедрить его в свой проект.

Проект состоит из нескольких классов, таких как ghost, pacman и т. Д., И класса "Game", который является QGraphicsView и также содержит указатели на этот объект.Проблема в том, что когда я создаю класс «Game» и передаю poiter объекту mock_pacman, он не использует его mocked-методы и, похоже, не обнаруживает использование mock_pacman (когда я пытаюсь выполнить EXPECT_CALL (..), тест не пройден),В качестве примера я просто опубликую часть кода, которая ссылается на простейший метод:

Конструкторы класса "Game":

Game(QWidget * parent=nullptr) {...};
Game(QVector<ghost*> GhostArray, pacman * _player, PacmanBoard * Board, QWidget * parent=nullptr)

Конструктор Secound просто помещает _player в качестве члена

Метод, который я хотел бы проверить:

    int Game::getPacmanDirection()
{
    return player->getActualDirection();
}

Макет Пакмана:

    class mock_pacman: public pacman
{
public:
    virtual ~mock_pacman()=default;
    MOCK_METHOD1(keyPressEvent,void(QKeyEvent *));
    MOCK_METHOD0(getPosition,QPointF());
    MOCK_METHOD1(setPosition,void(QPointF()));
    MOCK_METHOD0(update,void());
    MOCK_METHOD0(getAnimationPhase,void());
    MOCK_METHOD1(setAnimationPhase,void(int));
    MOCK_METHOD0(animate,void());
    MOCK_METHOD0(getActualDirection,int());
    MOCK_METHOD0(getLastMove,QPoint());
    MOCK_CONST_METHOD0(pos,QPointF());

};

Тест Google:

    TEST(GameClassTests, GettingPacmanRealDirection)
{


  mock_pacman * m_pacman = new mock_pacman();
  mock_pacmanboard m_board;
  mock_ghost ghost0(0);
  mock_ghost ghost1(1);
  mock_ghost ghost2(2);
  mock_ghost ghost3(3);

  QVector<ghost*> m_ghost_vector{&ghost0,&ghost1,&ghost2,&ghost3};
  EXPECT_CALL(*m_pacman,getActualDirection());

  Game * game = new Game(m_ghost_vector,m_pacman,&m_board);
  game->getPacmanDirection();

  delete m_pacman;
};

Результат теста:

[ RUN      ] GameClassTests.GettingPacmanRealDirection
../PacmanTests/tst_alltests.h:110: Failure
Actual function call count doesn't match EXPECT_CALL(*m_pacman, getActualDirection())...
         Expected: to be called once
           Actual: never called - unsatisfied and active
[  FAILED  ] GameClassTests.GettingPacmanRealDirection (4 ms)

Функция getActualDirection () в оригинальном классе pacman помечена как виртуальная.Я пытался сделать это другими методами, использовать тестовое приспособление, передать ссылку и многие другие варианты.

Где я ошибаюсь?

...