Testowanie z Mockito
Naszym zadaniem podczas kurs Java z Great Wrzesień 2022 było stworzenie PULL REQUESTA-a z implementacją i testami serwisu w mockito.
Mockito jest biblioteką , która umożliwia mockowanie zachowania się klas. Tworzone są tak zwane klasy wydmuszki ( mocki ), w których nagrywamy zachowanie klasy, zamiast wykonywać jej realną implementację. Ma to znaczenie, przy większych serwisach, działającymi z innymi serwisami i repozytoriami.
Gdy warstwa niższa jest już przetestowana swoimi testami, nie ma sensu ponawiać tych testów w warstwie wyższej ,jak repository -> service.
W związku z tym, stosujemy mocki korzystając z biblioteki mockito. Rozważmy poniższy kod z PR-a:
@BeforeEach
public void setup() throws Exception {
this.employee = new Employee(FIRST_NAME_TEST, LAST_NAME_TEST, PESEL_TEST, SALARY_TEST);
}
@Test
void create() throws Exception {
//given
when(employeeRepo.create(anyString(), anyString(), anyString(), any(BigDecimal.class))).thenReturn(this.employee);
//when
EmployeeDto employeeDTO = employeeService.create(FIRST_NAME_TEST, LAST_NAME_TEST, PESEL_TEST, SALARY_TEST);
//then
assertNotNull(employeeDTO);
assertEquals(FIRST_NAME_TEST, employeeDTO.getFirstName());
assertEquals(LAST_NAME_TEST, employeeDTO.getLastName());
assertEquals(PESEL_TEST, employeeDTO.getPesel());
assertEquals(SALARY_TEST, employeeDTO.getSalary());
}
Klasa EmployeRepository jest użyta w implementacji metod z klasy EmployeeService i jest ona odpowiednio przetestowana. Testując service nie należy testować jej ponownie, tylko zamokować jej zachowanie przez mockito. To właśnie robi kolejna linijka:
//given
when(employeeRepo.create(anyString(), anyString(), anyString(), any(BigDecimal.class))).thenReturn(this.employee);
W tej linijce mówimy, że jeśli ktoś wywoła metodę employeeRepo.create() z jakimikolwiek parametrami zgodnymi sygnaturą metody, wtedy zawsze zwróci obiekt this.employee.
Gdybyśmy chcieli nagrać więcej zachowań do tej metody, to byśmy musieli bardziej sprecyzować parametry. To właśnie magia mocka!
//when EmployeeDto employeeDTO = employeeService.create(FIRST_NAME_TEST, LAST_NAME_TEST, PESEL_TEST, SALARY_TEST);
Teraz jesteśmy w stanie sprawdzić, czy z wgranym mockiem klasy repository, metoda serwisu działa poprawnie. Testowana jest więc pozostała zawartość metody, a mock zwraca z góra znaną wartość.
//then
assertNotNull(employeeDTO);
assertEquals(FIRST_NAME_TEST, employeeDTO.getFirstName());
assertEquals(LAST_NAME_TEST, employeeDTO.getLastName());
assertEquals(PESEL_TEST, employeeDTO.getPesel());
assertEquals(SALARY_TEST, employeeDTO.getSalary());
Polecam korzystać z biblioteki mockito —> https://site.mockito.org/