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

Use*_*ser 7 c++ constructor mocking default-constructor googlemock

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

EmployeeFake employeeStub;
Run Code Online (Sandbox Code Playgroud)

错误是:

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

EmployeeFake:

class EmployeeFake: public Employee{
 public:
  MOCK_CONST_METHOD0(GetSalary,
      double());
}
Run Code Online (Sandbox Code Playgroud)

雇员:

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

    virtual double GetSalary() const;
}
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*yan 10

您可以只将一个构造函数添加到委托给Employee构造函数的mock中:

 class MockEmployee : public Employee {
     public:
         MockEmployee(PensionPlan* pension_plan, const char* full_name)
         : Employee(pension_plan, full_name) {}
         // ...
 };
Run Code Online (Sandbox Code Playgroud)

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

  1. 使Employee纯虚拟(使用受保护的默认构造函数).
  2. 将当前的Employee实现重命名为描述员工类型的名称(例如FullTimeEmployee或EmployeeWithPensionPlan),并使其从纯虚拟类型继承.
  3. 使用"virtual~Employee()"代替"virtual~Employee(void)"(在参数中显式使用void是C的保留,并且就我所知,在大多数C++社区中都不流行).
  4. 使用"const string&"代替"const char*"作为名称.

所以,澄清一下,我的建议是:

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 ...
};
Run Code Online (Sandbox Code Playgroud)