gmock:如何将模拟类的指针传递到另一个类



我必须用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(。

相关内容

最新更新