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);
.
.
}