Тестирование формы регистрации Spring Boot - NullPointerException - PullRequest
0 голосов
/ 08 февраля 2020

Я изучаю веб-приложение Spring Boot с jsp, и я много борюсь с концепциями тестирования. Из руководств SO и YT я реализовал Mockito, но, честно говоря, я не совсем понимаю, как это работает.
У меня есть регистрационная форма с 4 полями для name, lastname, email и password. Этот запрос POST обрабатывается методом registerAction в RegisterController. В этом методе у меня есть два самописных валидатора для электронной почты и пароля. Тесты должны обрабатывать случаи, когда пользовательские данные передаются правильно, и если ошибки отправляются, когда ввод неправильный.
Я пытался написать тесты для контроллера, но постоянно получаю исключение NullPointerExpection. Что касается отладчика, то объект User, отправленный из класса тестирования, имеет атрибуты null, что, вероятно, является причиной исключений.
Класс тестирования:

@SpringBootTest
@AutoConfigureMockMvc
class RegisterControllerTest {

    @Autowired
    private WebApplicationContext wac;

    @MockBean
    private UserService userService;

    @Autowired
    private Gson gson;

    @Autowired
    private MockMvc mockMvc;


    @BeforeEach
    void setUp() {
        initMocks(this);
        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac)
          .apply(springSecurity()).build();
    }

    @Test
    void show_register_action() throws Exception {
        User user = prepareUserEmpty();

        this.mockMvc.perform(post("/adduser")
                .contentType(MediaType.APPLICATION_JSON)
                .content(gson.toJson(user)))
                .andDo(print())
                .andExpect(status().isOk());
    }

    private User prepareUserEmpty(){
        User user = new User();
        user.setEmail("");
        user.setPassword("");
        user.setName("");
        user.setLastName("");

        return user;
    }
}

RegisterController:

@Controller public class RegisterController {

    @Autowired
    private UserService userService;

    @Autowired
    private EmailSender emailSender;

    @Autowired
    MessageSource messageSource;    // Allows to obtain messages from message.properties to Java code

    @POST
    @RequestMapping(value = "/adduser")
    public String registerAction(User user, BindingResult result, Model model, Locale locale){  // BindingResult for validation, Locale for messageSource

        String returnPage = "register";

        User userExist = userService.findUserByEmail(user.getEmail());

        new UserRegisterValidator().validate(user, result);
        new UserRegisterValidator().validateEmailExist(userExist, result);

        if (!(result.hasErrors())){
            userService.saveUser(user);
            model.addAttribute("message", messageSource.getMessage("user.register.success.email", null, locale));

            returnPage = "index";
        }

        return returnPage;
    } }

Валидаторы:

public class UserRegisterValidator implements Validator {

    @Override
    public boolean supports(Class <?> cls){
        return User.class.equals(cls);
    }

    @Override
    public void validate(Object obj, Errors errors){
        User u = (User) obj;

        ValidationUtils.rejectIfEmpty(errors, "name", "error.userName.empty");
        ValidationUtils.rejectIfEmpty(errors, "lastName", "error.userLastName.empty");
        ValidationUtils.rejectIfEmpty(errors, "email", "error.userEmail.empty");
        ValidationUtils.rejectIfEmpty(errors, "password", "error.userPassword.empty");

        if (!u.getEmail().equals(null)){
            boolean isMatch = AppdemoUtils.checkEmailOrPassword(AppdemoConstants.EMAIL_PATTERN, u.getEmail());
            if (!isMatch)
                errors.rejectValue("email", "error.userEmailIsNotMatch");
        }

        if (!u.getPassword().equals(null)){
            boolean isMatch = AppdemoUtils.checkEmailOrPassword(AppdemoConstants.PASSWORD_PATTERN, u.getPassword());
            if (!isMatch)
                errors.rejectValue("password", "error.userPasswordIsNotMatch");
        }
    }

    public void validateEmailExist(User user, Errors errors){
        if (user != null)
            errors.rejectValue("email", "error.userEmailExist");
    }

}
...