问题
I'm working on a C++ production code here with googletest/googlemock. I've stumble upon this idea when working with one of the function in A.cpp:
bool A::process_(false);
bool A::process()
{
if ( !process_ ){
process_ = true;
}
return process_;
}
where the header contains:
protected:
static bool process_;
public:
static bool process();
I am stuck in a way that I can only test the function for an expected output of true or an input of false like so:
TEST(ATest, processVal){
A a;
EXPECT_TRUE(a.process());
}
Is there a way to test the function so that both *true*
and *false*
value of process_
is passed ? So that the test covers the decision for both.
I was thinking mocking so that it can expect a call for both true and false but because it is not a function in a member of a class, I guess you can not do mocking for process_ ?
If you can, how to mock the variable?
Note: I'm on linux and gcc :) thank you !
回答1:
- Solution1: To access any
protected
attribute/method from a test without modifying production code
You can easily modify _process
even if protected, just do this:
class SubA : public A
{
public:
void setProcess( bool val ) { process_ = val; }
};
A a;
SubA* pA = (SubA*) &a;
pA->setProcess( false );
This will work pretty well and is safe. Even if you are casting A*
to SubA*
which is not really valid, it will work as SubA
objects in memory are the same as A
objects (as SubA
does not declare any extra attribute).
This only works because process_
is protected
, so you create a derived class SubA
and use it because compiler will allow this subclass to access the protected stuff.
- Solution2: To access any
protected
and evenprivate
attribute/method from a test without modifying production code
Now, if process_
was private
, this would not work...but, private
/protected
is only managed by the compiler...the attributes are here in memory and you may access them even if you are not "allowed to".
It's ugly but works perfectly:
#define protected public
#define private public
#include "A.h"
#undef private
#undef protected
{
A a;
a._process = false;
}
This hack makes it easy to access any private
/protected
attributes/functions from your test programs.
回答2:
Declare a subclass of A
. Since process_
is protected
, you can use the subclass of A to set it to
trueor
false`, before running the test.
来源:https://stackoverflow.com/questions/37346690/unit-test-a-variable-for-both-true-and-false