Below we have a Student class with Private Class Variable(id and name), Service and Private Methods.
Student.java
public class Student { private Integer id; private String name; @Autowired private StudentService studentService; private String getStudentDetails(){ return "id: " + getId() + "; name: " + getName(); } }
Mocking a Private Field
we cannot access the private field id to assign a value for testing, because there isn’t a public setter method for it.
We can then use ReflectionTestUtils.setField method to assign a value to the private member id
StudentTest.java
@Test public void setValueWithNoSetter() { Student student = new Student(); ReflectionTestUtils.setField(student, "id", 101); assertTrue(student.getId().equals(101)); }
Mocking a Private Method
In a similar way we can invoke private method – getStudentDetails() as below in student class
StudentTest.java
@Test public void whenNonPublicMethod_thenReflectionTestUtilsInvokeMethod() { Student student= new Student (); ReflectionTestUtils.setField(student, "id", 101); ReflectionTestUtils.setField(student, "name", "Mugil"); assertTrue(ReflectionTestUtils.invokeMethod(student, "employeeToString").equals ("id: 101; name: Mugil")); }
Mocking a Private Dependencies
StudentTest.java
@Test public void whenNonPublicMethod_thenReflectionTestUtilsInvokeMethod() { Student student = new Student(); StudentService studService = mock(StudentService.class); when(studService.getStudentStatus(student.getId())).thenReturn("Active"); ReflectionTestUtils.setField(student, "studentService", studService); . . }