Search code examples
c++googletestgooglemock

Google Mock unit testing static methods c++


I just started working on unit testing (using BOOST framework for testing, but for mocks I have to use Google Mock) and I have this situation :

class A
{
static int Method1(int a, int b){return a+b;}
};

class B
{
static int Method2(int a, int b){ return A::Method1(a,b);}
};

So, I need to create mock class A, and to make my class B not to use real Method1 from A class, but to use mock.

I'm not sure how to do this, and I could not find some similar example.


Solution

  • You could change class B into a template :

    template< typename T >
    class B
    {
    public:
    static int Method2(int a, int b){ return T::Method1(a,b);}
    };
    

    and then create a mock :

    struct MockA
    {
      static MockCalc *mock;
      //This class is passed as template type during class B object creation in unit test environment
      static int Method1(int a, int b){ return mock->Method1(a,b);}
    };
    class MockCalc {
     public:
      MOCK_METHOD2(Method1, int(int,int));
    };
    

    Before every test, initialize the static mock object MockA::mock.

    Another option is to instead call directly A::Method1, create a functor object (maybe std::function type) in class B, and call that in the Method2. Then, it is simpler, because you would not need MockA, because you would create a callback to MockCalc::Method1 to this object. Something like this :

    class B
    {
    public:
    static std::function< int(int,int) > f;
    static int Method2(int a, int b){ return f(a,b);}
    };
    
    class MockCalc {
     public:
      MOCK_METHOD2(Method1, int(int,int));
    };
    

    and to initialize it :

    MockCalc mock;
    B::f = [&mock](int a,int b){return mock.Method1(a,b);};