You should not test private method. If you have to do it, then it is a sign that you may have a design flaw in your code. Regardless of my warning, if you still want to do it, then here is how you can do it through Java reflection.
Class to test
This class contains the private method that you want to test.
public class ClassExample { private String privateFoo(int a, String b) { return a + b; } }
Test using Java Reflection
The code below uses Java Reflection to change the property of the private method and make it accessible.
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import org.testng.annotations.Test; import static org.testng.Assert.assertEquals; public class ClassExampleTest { @Test public void privateFooTest() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { // Get the class of the private method. ClassExample oClassExample = new ClassExample(); Class<?> cNewClassExample = oClassExample.getClass(); // Change the property of the private method to be accessible. Method newPrivateFoo = cNewClassExample.getDeclaredMethod("privateFoo", int.class, String.class); newPrivateFoo.setAccessible(true); // Run the private method. Object oActual = newPrivateFoo.invoke(oClassExample, new Integer(169), new String("_ABC")); // Test the private method String sActual = oActual.toString(); String sExpected = "169_ABC"; assertEquals(sActual, sExpected); } }
Output
Github
- https://github.com/xuanngo2001/java-testng/blob/master/src/net/openwritings/testng/privateex/ClassExample.java
- https://github.com/xuanngo2001/java-testng/blob/master/src/net/openwritings/testng/privateex/ClassExampleTest.java