Google Mock unit testing static methods c++
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);};
Related videos on Youtube
Jonhtra
Updated on August 05, 2022Comments
-
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 over 12 yearsI'm not familiar with gmock, but couldn't you just link
B.o
andmockA.o
? -
Jonhtra over 12 yearsAs 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 over 12 yearsThanks, this was the answer I was looking for :)
-
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 over 12 yearsO 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 over 12 yearsI posted a new qustion so when you catch a time take a look :)
-
zkoza over 2 yearsThis 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 over 2 yearsWell. 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 over 2 yearsWell, 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.