gmock:如何将模拟 class 的指针传递给另一个 class?

gmock: How do I pass a pointer of a mock class into another class?

我必须使用 gmock 测试以下 classes 并且由于我对 Gmock 测试总体来说还很陌生,所以我不知道这些错误是从哪里来的。所以我的模型 class 在 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模型使用了class子模型,其定义如下:

class Submodel {

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

我也为Submodel定义了对应的Mock Class:

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 结构,我认为这会自动发生?

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点)。