java - Spring Boot 注册表单测试 - NullPointerException
问题描述
我使用 .jsp 学习 Spring Boot Web 应用程序,并且在测试概念方面遇到了很多困难。从 SO 和 YT 指南中,我实现了这个Mockito
东西,但老实说,我并不清楚它是如何工作的。
我有一个注册表单,其中包含、name
和4个字段。此 POST 请求由 中的方法处理。在这种方法中,我有两个自行编写的电子邮件和密码验证器。测试应该处理正确给出用户数据以及输入不正确时发送错误的情况。
我试图为控制器编写测试,但我经常遇到异常。查看调试器,从测试类发送的对象有lastname
email
password
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;
}
}
注册控制器:
@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");
}
}
解决方案
推荐阅读
- unity3d - 在 unity3D 中创建移动文本
- javascript - 如何在反应中的页面之间传递链接ID?
- javascript - 如何获取单个元素的 CSS 选择器/Xpath
- flutter - 如何在 Flutter 中动态生成多个 Dropdown?
- javascript - Electron-redux 在浏览器窗口之间共享状态
- sql-server - 远程数据库的 appsettings.json 中的连接字符串
- google-apps-script - file.MoveTo 不会移动共享文件夹中的文件
- c# - 如何将一个数据表列的值除以标签文本的值?
- php - Laravel - Eloquent - 如何汇总相关数据并查询它?
- python - 如何关联这两个枚举?