#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
после этого момента).