How do I unit test (using xUnit) a class that has internal private methods, fields or nested classes? Or a function that is made private by having internal linkage (
static in C/C++) or is in a private (anonymous) namespace?
It seems bad to change the access modifier for a method or function just to be able to run a test.
If you have somewhat of a legacy Java application, and you’re not allowed to change the visibility of your methods, the best way to test private methods is to use reflection.
Internally we’re using helpers to get/set
private static variables as well as invoke
private static methods. The following patterns will let you do pretty much anything related to the private methods and fields. Of course you can’t change
private static final variables through reflection.
Method method = targetClass.getDeclaredMethod(methodName, argClasses);
return method.invoke(targetObject, argObjects);
And for fields:
Field field = targetClass.getDeclaredField(fieldName);
targetClass.getDeclaredMethod(methodName, argClasses)lets you look into
privatemethods. The same thing applies for
setAccessible(true)is required to play around with privates.