Google Mock:“没有合适的默认构造函数”?

时间:2011-07-05 23:56:01

标签: c++ constructor mocking default-constructor googlemock

将Visual Studio 2010 C ++与googlemock一起使用。我正在尝试使用我创建的模拟,我在线上得到编译器错误:

EmployeeFake employeeStub;

错误是:

1>c:\someclasstests.cpp(22): error C2512: 'MyNamespace::EmployeeFake' : no appropriate
default constructor available

EmployeeFake:

class EmployeeFake: public Employee{
 public:
  MOCK_CONST_METHOD0(GetSalary,
      double());
}

员工:

class Employee 
{
public:
    Employee(PensionPlan *pensionPlan, const char * fullName);
    virtual ~Employee(void);

    virtual double GetSalary() const;
}

我认为问题是基类没有默认构造函数但是我应该如何解决这个问题呢?我是否需要在基类中添加默认构造函数?或者我是否需要在我的模拟类中添加构造函数?或其他什么?

2 个答案:

答案 0 :(得分:9)

您可以向模拟中添加一个构造函数,该构造函数委托给Employee构造函数:

 class MockEmployee : public Employee {
     public:
         MockEmployee(PensionPlan* pension_plan, const char* full_name)
         : Employee(pension_plan, full_name) {}
         // ...
 };

然后构建MockEmployee,就像构建Employee一样。但是,有一些事情可以改进,我强烈推荐这个代码,这将简化这个:

  1. 使Employee纯虚拟(使用受保护的默认构造函数)。
  2. 将当前的Employee实现重命名为描述员工类型的名称(例如FullTimeEmployee或EmployeeWithPensionPlan),并使其继承纯虚拟类型。
  3. 使用“virtual~Employee()”而不是“virtual~Employee(void)”(在参数中显式使用void是C的保留,并且就我所知,在大多数C ++社区中都是不流行的)。
  4. 使用“const string&”而不是名字的“const char *”。
  5. 因此,澄清一下,我的建议是:

    class Employee {
        public:
            virtual ~Employee() {}
            virtual double GetSalary() const = 0;
        protected:
            Employee() {}
    };
    
    class FullTimeEmployee : public Employee {
         // your concrete implementation goes here
    };
    
    class MockEmployee : public Employee {
        public:
            MockEmployee() {}
            virtual ~MockEmployee() {}
            // ... your mock method goes here ...
    };
    

答案 1 :(得分:2)

你已经提出了一个可能的答案,但让我们拼出一些选择:

1)使基本默认可构造。通过提供默认参数最容易做到:

explicit Employee(PensionPlan *pensionPlan = 0, const char * fullName = "");

(请注意,我们说explicit是为了避免来自PensionPlan*的隐性转化。)

2)在派生类的构造函数的基本初始化列表中调用构造函数:

EmployeeFake::EmployeFake() : Employee(0, "") { }

2a)给EmployeeFake一个合适的构造函数并传递它:

EmployeeFake::EmployeeFake(PensionPlan *p) : Employee(p, "[fake]") { } 

(注意(1)是声明,而(2)和(2a)是定义。)