Home > DeveloperSection > Forums > How to test a class that has private methods, fields or inner classes
Chintoo Semi

Total Post:135

Points:947
Posted on    May-06-2015 12:02 AM

 Java Java  Unit Testing 
Ratings:


 1 Reply(s)
 445  View(s)
Rate this:
How do I use JUnit to test a class that has internal private methods, fields or nested classes? It seems bad to change the access modifier for a method just to be able to run a test.


Mayank Tripathi
Mayank Tripathi

Total Post:397

Points:3117
Supported
Posted on    May-06-2015 12:32 AM

If you have somewhat of a legacy 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 and private static variables as well as invoke private and 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);
method.setAccessible(true);
return method.invoke(targetObject, argObjects);
And for fields:

Field field = targetClass.getDeclaredField(fieldName);
field.setAccessible(true);
field.set(object, value);
Notes:
1. targetClass.getDeclaredMethod(methodName, argClasses) lets you look into private methods. The same thing applies for  getDeclaredField.
2. The setAccessible(true) is required to play around with privates.

Don't want to miss updates? Please click the below button!

Follow MindStick