This question already has an answer here:
I am very new to unit testing and I am a little confused.
I am trying to do unit testing (using the Boost unit testing framework) on a C++ class called VariableImpl
. Here are the details.
class Variable
{
public:
void UpdateStatistics (void) {
// compute mean based on m_val and update m_mean;
OtherClass::SendData (m_mean);
m_val.clear ();
}
virtual void RecordData (double) = 0;
protected:
std::vector<double> m_val;
private:
double m_mean;
};
class VariableImpl : public Variable
{
public:
virtual void RecordData (double d) {
// put data in m_val
}
};
My question is how can I check that the mean is computed correctly? Note that 1) m_mean
is protected and 2) UpdateStatistics
calls a method of another class and then clears the vector.
The only way I can see would be to add a getter (for instance, GetMean
), but I don't like this solution at all, nor I think it is the most elegant.
How should I do?
And what should I do if I were to test a private method instead of a private variable?
TIA,
Jir
Well, unit testing should test units and ideally every class is a self-contained unit – this follows directly from the single responsibility principle.
So testing private members of a class shouldn’t be necessary – the class is a black box that can be covered in a unit test as-is.
On the other hand, this isn’t always true, and sometimes with good reasons (for instance, several methods of the class could rely on a private utility function that should be tested). One very simple, very crufty but ultimately successful solution is to put the following into your unit-test file, before including the header that defines your class:
Of course, this destroys encapsulation and is evil. But for testing, it serves the purpose.
Good approach to test the protected data in c + + is the assignment of a friend proxy class:
see more goolge test (gtest): http://code.google.com/p/googletest-translations/
While in my opinion the need of testing private members/methods of a class is a code smell, I think that is technically feasible in C++.
As an example, suppose you have a Dog class with private members/methods except for the public constructor:
Now for some reason you would like to test the private ones. You could use privablic to achieve that.
Include a header named privablic.h along with the desired implementation like that:
then map some stubs according to types of any instance member
...and instance method;
do the same with all static instance members
...and static instance methods.
Now you can test them all:
Output:
You can look at the sources of test_dog.cpp and dog.hpp.
DISCLAIMER: Thanks to insights of other clever people, I have assembled the aforementioned "library" able to access to private members and methods of a given C++ class without altering its definition or behaviour. In order to make it work it's (obviously) required to know and include the implementation of the class.
NOTE: I revised the content of this answer in order to follow directives suggested by reviewers.
I generally suggest testing the public interface of your classes, not the private/protected implementations. In this case, if it can't be observed from the outside world by a public method, then the unit test may not need to test it.
If the functionality requires a child class, either unit test the real derived class OR create your own test derived class that has an appropriate implementation.
For a protected method/variable, inherit a Test class from the class and do your testing.
For a private, introduce a friend class. It isn't the best of solutions but can do the work for you.
Or this hack
Example from the google testing framework:
The main idea is the use of the friend cpp keyword. You can extend this example as following:
You can define the TEST_FOO preprocessor in two ways:
1)within the CMakeLists.txt
2)as arguments to your compiler