Я изучаю веб-приложение 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");
}
}