Как проверить функцию контроллера с помощью формы аргумента?

Внимание! Это мой первый пост здесь, прошу прощения за недостающую информацию или вопросы действительно новичка.

Итак, в настоящее время я пытаюсь написать тесты 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();
}

В вашем приложении будет некоторый класс, расширяющий EmployeeRegistrationForm

Aditya Narayan Dixit 27.12.2018 17:29
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
1
90
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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.

Другие вопросы по теме