gmock: как мне передать указатель на макет класса в другой класс?

#c #googletest #googlemock

#c #googletest #googlemock

Вопрос:

Я должен протестировать следующие классы с помощью gmock, и поскольку я довольно новичок в тестировании Gmock в целом, я понятия не имею, откуда я получаю эти ошибки. Итак, у меня есть свой класс модели в Model.hpp, который выглядит следующим образом:

 class Model {
  public:
  Model(double delta_t) : Delta_t(delta_t){};
  void add_submodel(std::unique_ptr< Submodel > submodel_ptr); //function adds submodels to private vector below

  private:
  std::vector<std::unique_ptr< Submodel>> submodel;

  protected:
  const double Delta_t;
};
  

В приведенной выше модели класса используется подмодель класса, которая определяется следующим образом:

 class Submodel {

  public:
  virtual ~ Submodel() {};
  virtual unsigned int get_number_of_states() = 0;
}
  

Я также определил соответствующий макет класса для подмодели:

 class MockSubmodel : public Submodel {

        public:
        MOCK_METHOD(unsigned int, get_number_of_states,(),(override));

    };

  

Пока все хорошо. Теперь я хочу проверить, действительно ли функция model.add_subproblem(std::unique_ptr submodel_ptr) добавляет подмодели к модели. Поэтому я начал определять следующий тест:

 TEST(modelTest, Add_Submodel) {

    Model::Model model(1); 
  
    auto mock1_ptr = std::make_unique<Model::MockSubmodel>();
    model.add_subproblem(mock1_ptr);
    
}
  

Ошибка, которую я получаю здесь:

 error: no viable conversion from 'unique_ptr<Model::MockSubmodel>' to 'unique_ptr<Model::Submodel>'
  

Итак, мой вопрос: как правильно передать MockSubmodel в качестве указателя в add_submodel(), чтобы его можно было распознать как подмодель? Я думал, что это произойдет автоматически из-за структуры gmock?

Комментарии:

1. Вы пробовали add_subproblem(make_unique<...>(...)) или add_subproblem(std::move(mock1_ptr)) ? Уникальные указатели не копируются.

2. Да, это помогло мне! Я думал, что проблема была в gmock, поэтому я не рассматривал это! Большое вам спасибо!

Ответ №1:

add_submodel Функция принимает свой std::unique_ptr<Submodel> параметр по значению. При вызове model.add_subproblem(mock1_ptr); это приведет к mock1_ptr копированию. Однако unique_ptr не может быть скопирован.

Чтобы исправить это, вы можете удалить переменную и напрямую передать временную, как в model.add_subproblem(std::make_unique<Model::MockSubmodel>()); . В качестве альтернативы, вы можете переместить unique_ptr в , как в model.add_subproblem(std::move(mock1_ptr)); (но вы должны помнить, что mock1_ptr станет nullptr после этого момента).