Google Mock unit testing static methods c++

33,297

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;
  static int Method2(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);};
Share:
33,297

Related videos on Youtube

Jonhtra
Author by

Jonhtra

Updated on August 05, 2022

Comments

  • Jonhtra
    Jonhtra almost 2 years

    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.

    • Beta
      Beta over 12 years
      I'm not familiar with gmock, but couldn't you just link B.o and mockA.o?
    • Jonhtra
      Jonhtra over 12 years
      As far as I know, there is some different way dealing with static methods. I could probably solve this with making Method1 to be virtual, and to add constructor in class B, so it looks something like B(A &a):a_in_class_b(a){}, and then call of Method1 would look like this : a_in_class_b->Method1(); But I want to see if there is some other way.
  • Jonhtra
    Jonhtra over 12 years
    Thanks, this was the answer I was looking for :)
  • BЈовић
    BЈовић over 12 years
    @user1160721 there should be the "accept answer" button on the left, if this answer is the one you are looking for ;)
  • Jonhtra
    Jonhtra over 12 years
    O yeah, I can see it now, I'll click it, I'm new here. I can see there is some rating for every user and this "accept answer" increases this rating :) I have one more similar question related to this. To post a new one, or to ask in the comment ? :)
  • Jonhtra
    Jonhtra over 12 years
    I posted a new qustion so when you catch a time take a look :)
  • zkoza
    zkoza over 2 years
    This does not provide an answer to the question. Once you have sufficient reputation you will be able to comment on any post; instead, provide answers that don't require clarification from the asker. - From Review
  • Hyugrae Cho
    Hyugrae Cho over 2 years
    Well. the original question was "how to mock static functions", and I also have looked for the way to mock static or non-virtual method to avoid modification of legacy source code. "jomock" provides a solution with simple syntax by using function hook internally.
  • zkoza
    zkoza over 2 years
    Well, the problem I see is that your answer is kind of side remark, and as such it would suffice if you left a simple comment under the question, pointing out that jomock offers another solution for Windows.