Внимание! Это мой первый пост здесь, прошу прощения за недостающую информацию или вопросы действительно новичка.
Итак, в настоящее время я пытаюсь написать тесты jUnit для уже готового веб-приложения, использующего spring (все работает, мне просто нужно получить полное покрытие с помощью тестов). У меня есть классы: «Сотрудник», «EmployeeController» и «EmployeeManagement». Я хочу протестировать функцию «registerNew», которая создает нового сотрудника с заполненной формой «EmployeeRegistrationForm», если в ней нет ошибок («Результат ошибок»).
Теперь я хочу написать тест для этого, чтобы убедиться, что функция действительно создает новый объект «Сотрудник», который должен быть сохранен в «Репозиторий сотрудников» с указанной формой.
Однако мне кажется, что я не могу создать заполненную «EmployeeForm», поскольку она абстрактна и не может быть создана. Поэтому я изо всех сил пытаюсь дать какой-либо аргумент этой функции и не знаю, как передать информацию, необходимую для теста, в проверяемую функцию.
@Service
@Transactional
public class EmployeeManagement {
private final EmployeeRepository employees;
private final UserAccountManager userAccounts;
EmployeeManagement(EmployeeRepository employees, UserAccountManager userAccounts) {
Assert.notNull(employees, "employeeRepository must not be null!");
Assert.notNull(userAccounts, "UserAccountManager must not be null!");
this.employees=employees;
this.userAccounts = userAccounts;
}
//the function that creates the employee
public Employee createEmployee(EmployeeRegistrationForm form) {
Assert.notNull(form, "Registration form must not be null!");
String type = form.getType();
Role role = this.setRole(type);
UserAccount useraccount = userAccounts.create(form.getUsername(), form.getPassword(), role);
useraccount.setFirstname(form.getFirstname());
useraccount.setLastname(form.getLastname());
return employees.save(new Employee(form.getNumber(), form.getAddress(), useraccount));
}
@Controller
public class EmployeeController {
private final EmployeeManagement employeeManagement;
EmployeeController(EmployeeManagement employeeManagement) {
Assert.notNull(employeeManagement, "userManagement must not be null!");
this.employeeManagement = employeeManagement;
}
@PostMapping("/registerEmployee")
@PreAuthorize("hasRole('ROLE_ADMIN')")
String registerNew(@Valid EmployeeRegistrationForm form, Errors result) {
if (result.hasErrors()) {
return "registerEmployee";
}
employeeManagement.createEmployee(form);
return "redirect:/";
}
public interface EmployeeRegistrationForm {
@NotEmpty(message = "{RegistrationForm.firstname.NotEmpty}")
String getFirstname();
@NotEmpty(message = "{RegistrationForm.lastname.NotEmpty}")
String getLastname();
@NotEmpty(message = "{RegistrationForm.password.NotEmpty}")
String getPassword();
@NotEmpty(message = "{RegistrationForm.address.NotEmpty}")
String getAddress();
@NotEmpty(message = "{RegistrationForm.number.NotEmpty}")
String getNumber();
@NotEmpty(message = "{RegistrationForm.type.NotEmpty}")
String getType();
@NotEmpty(message = "{RegistrationForm.username.NotEmpty}")
String getUsername();
}




However, I cannot seem to be able to create a filled "EmployeeForm" since it is abstract and cannot be instantiated.
Используйте Mockito для создания экземпляров ваших абстрактных классов. Вы можете использовать это так:
EmployeeForm form = mock(EmployeeForm.class);
Теперь у вас есть экземпляр EmployeeForm, который вы можете передать своим методам. Если вам нужно вызвать некоторые методы из вашего макета, вы можете сделать что-то вроде этого:
given(form.getFirstname()).willReturn("John");
Таким образом форма будет вести себя так, как вы хотите.
Примечание. mock() поступает от org.mockito.Mockito, а given - от org.mockito.BDDMockito.
В вашем приложении будет некоторый класс, расширяющий
EmployeeRegistrationForm