In this post, we will see how to write test cases for private methods using reflection.
We have two classes Employee.java and EmployeeTest.java in the same package reflectionjunit. We have a private method getEmployeename() which returns a string. We are going to write JUnit test cases for this method.
Employee.java
package reflectionjunit; public class Employee { private String getEmployeename(String name) { //some dummy logic if(name.equals("ram")) { return name; } return "mohan"; } }
EmployeeTest.java
package reflectionjunit; import static org.junit.Assert.assertEquals; import java.lang.reflect.Method; import org.junit.BeforeClass; import org.junit.Test; public class EmployeeTest { public static Employee employeeObj; @BeforeClass public static void beforeClass() { employeeObj = new Employee(); } @Test public void testGetEmployeenameSuccess() throws Exception { String name = "ram"; Method method = Employee.class.getDeclaredMethod("getEmployeename", String.class); method.setAccessible(true); String returnValue = (String) method.invoke(employeeObj, name); assertEquals(returnValue, "ram"); } }
Run the above code as Junit.
Yes, we have a success result.
Let’s check the fail case.
package reflectionjunit; import static org.junit.Assert.assertEquals; import java.lang.reflect.Method; import org.junit.BeforeClass; import org.junit.Test; public class EmployeeTest { public static Employee employeeObj; @BeforeClass public static void beforeClass() { employeeObj = new Employee(); } @Test public void testGetEmployeenameFailure() throws Exception { String name = "ram"; Method method = Employee.class.getDeclaredMethod("getEmployeename", String.class); method.setAccessible(true); String returnValue = (String) method.invoke(employeeObj, name); assertEquals(returnValue, "sohan"); } }
Output is –
This is the fail case. Since we are passing name is sohan but it’s expecting ram.