Search code examples
c++constructormockingdefault-constructorgooglemock

Google Mock: "no appropriate default constructor available"?


Using Visual Studio 2010 C++ with googlemock. I'm trying to use a mock I created and I'm getting the compiler error on the line:

EmployeeFake employeeStub;

The error is:

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());
}

Employee:

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

    virtual double GetSalary() const;
}

I gather that the problem is that the base class doesn't have a default constructor but how should I fix this? Do I need to add a default constructor to my base class? Or do I need to add a constructor to my mock class? Or something else?


Solution

  • You can just add a constructor to your mock that delegates to the Employee constructor:

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

    Then construct MockEmployee like you would construct Employee. However, there are a couple things that can be improved about this code that I would highly recommend and that would simplify this:

    1. Make Employee pure virtual (with a protected default constructor).
    2. Rename the current Employee implementation to a name that describes the kind of employee (e.g. FullTimeEmployee or EmployeeWithPensionPlan) and make it inherit from the pure virtual type.
    3. Use "virtual ~Employee()" instead of "virtual ~Employee(void)" (using void explicitly in the parameter is a hold over from C and is out of vogue in most C++ communities as far as I'm aware).
    4. Use "const string&" instead of "const char*" for the name.

    So, to clarify, my recommendation would be:

    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 ...
    };