首页 > 解决方案 > Spring Boot 注册表单测试 - NullPointerException

问题描述

我使用 .jsp 学习 Spring Boot Web 应用程序,并且在测试概念方面遇到了很多困难。从 SO 和 YT 指南中,我实现了这个Mockito东西,但老实说,我并不清楚它是如何工作的。
我有一个注册表单,其中包含、name和4个字段。此 POST 请求由 中的方法处理。在这种方法中,我有两个自行编写的电子邮件和密码验证器。测试应该处理正确给出用户数据以及输入不正确时发送错误的情况。 我试图为控制器编写测试,但我经常遇到异常。查看调试器,从测试类发送的对象有lastnameemailpasswordregisterActionRegisterController
NullPointerExpectionUsernull属性,这可能是异常的原因。
测试类:

@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;
    }
}

注册控制器:

@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");
    }

}

标签: javaspringformstestingmodel-view-controller

解决方案


推荐阅读