Let me try to explain the usage of mocking with simple
example.
EmployeeService.java:
This
class provides 'getEmployeeFirstNames' method, which takes list of employees as
input and return the list of all the first names of employees.
EmployeeUtil.java: It uses
the method 'getEmployeeFirstNames', of the class EmployeeService
Suppose let us assume, EmployeeUtil.java class
implemented its functionality, by assuming EmployeeService will be implemented
in time. Unfortunately, EmployeeService class is not yet implemented. Without
mocking, you can't unit test the methods of EmployeeUtil class, since it is
dependent on EmployeeService. By Mocking the methods of EmployeeService class
we can test Employeeutil class.
To test the functionality of EmployeeUtil class, we
should mock the method 'getEmployeeFirstNames' of class EmployeeService class.
Below statements define a mocked object if
EmployeeService class, whenever, you call the getEmployeeFirstNames with
employees, it returns employeeNames.
EmployeeService empService = Mockito.mock(EmployeeService.class);
PowerMockito.when(empService.getEmployeeFirstNames(employees)).thenReturn(employeeNames);
Find the below working application.
MethodNotImplementedException.java
package com.sample.exceptions; public class MethodNotImplementedException extends RuntimeException { private static final long serialVersionUID = 1L; public MethodNotImplementedException() { super(); } public MethodNotImplementedException(String message) { super(message); } }
Employee.java
package com.sample.model; public class Employee { private int id; private String firstName; private String lastName; private double salary; private String country; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } public Employee(int id, String firstName, String lastName, double salary, String country) { this.id = id; this.firstName = firstName; this.lastName = lastName; this.salary = salary; this.country = country; } @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("Employee [id=").append(id).append(", firstName=").append(firstName).append(", lastName=") .append(lastName).append(", salary=").append(salary).append(", country=").append(country).append("]"); return builder.toString(); } }
EmployeeService.java
package com.sample.service; import java.util.List; import com.sample.exceptions.MethodNotImplementedException; import com.sample.model.Employee; public class EmployeeService { public List<String> getEmployeeFirstNames(List<Employee> employees) { throw new MethodNotImplementedException(); } }
EmployeeUtil.java
package com.sample.util; import java.util.ArrayList; import java.util.List; import com.sample.model.Employee; import com.sample.service.EmployeeService; public class EmployeeUtil { private EmployeeService empService; public EmployeeUtil(EmployeeService empService) { this.empService = empService; } /** * Return all employee names in upper case. * * @param employees * @return */ public List<String> getAllEmployeeFirstNamesInUpperCase(List<Employee> employees) { List<String> empNamesInLowerCase = empService.getEmployeeFirstNames(employees); List<String> result = new ArrayList<>(empNamesInLowerCase.size()); for (String name : empNamesInLowerCase) { if (name == null) { continue; } result.add(name.toUpperCase()); } return result; } }
EmployeeUtilTest.java
import static org.junit.Assert.assertEquals; import java.util.ArrayList; import java.util.List; import org.junit.Test; import org.mockito.Mockito; import org.powermock.api.mockito.PowerMockito; import com.sample.model.Employee; import com.sample.service.EmployeeService; import com.sample.util.EmployeeUtil; public class EmployeeUtilTest { @Test public void getAllEmployeeFirstNamesInUpperCase_employees_namesMustBeInUpperCase() { Employee emp1 = new Employee(1, "Hari krishna", "Gurram", 12345, "India"); Employee emp2 = new Employee(2, "Kiran", "Kumnoor", 234556, "Germany"); Employee emp3 = new Employee(3, "Soumen", "Mondle", 56789, "India"); Employee emp4 = new Employee(4, "Sravya", "Guruju", 567890, "Japan"); Employee emp5 = new Employee(5, "Rachit", "Kumar", 123645, "India"); List<Employee> employees = new ArrayList<>(); List<String> employeeNames = new ArrayList<>(); employees.add(emp1); employees.add(emp2); employees.add(emp3); employees.add(emp4); employees.add(emp5); employeeNames.add("Hari krishna"); employeeNames.add("Kiran"); employeeNames.add("Soumen"); employeeNames.add("Sravya"); employeeNames.add("Rachit"); EmployeeService empService = Mockito.mock(EmployeeService.class); PowerMockito.when(empService.getEmployeeFirstNames(employees)).thenReturn(employeeNames); EmployeeUtil empUtil = new EmployeeUtil(empService); List<String> employeeFirstNames = empUtil.getAllEmployeeFirstNamesInUpperCase(employees); assertEquals(employeeFirstNames.size(), 5); assertEquals(employeeFirstNames.get(0), "Hari krishna".toUpperCase()); assertEquals(employeeFirstNames.get(1), "Kiran".toUpperCase()); assertEquals(employeeFirstNames.get(2), "Soumen".toUpperCase()); assertEquals(employeeFirstNames.get(3), "Sravya".toUpperCase()); assertEquals(employeeFirstNames.get(4), "Rachit".toUpperCase()); } }
No comments:
Post a Comment