我必须用gmock测试以下类,由于我对gmock测试还很陌生,我不知道这些错误是从哪里来的。所以我在Model.hpp中有我的Model类,它看起来像这样:
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;
};
上面的类Model使用的是类Submodel,其定义如下:
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(是否真的向model添加了子模型。因此,我开始定义以下测试:
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_submode((中,以便将其识别为子模型的正确方法是什么?我以为这会因为gmock结构而自动发生?
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
(。