Java 为什么我的请求没有';在Spring Boot中将json转换为模型对象
我想测试我的寄存器控制器,我得到了错误,bcz发布的数据没有转换到我的模型,测试落在验证上Java 为什么我的请求没有';在Spring Boot中将json转换为模型对象,java,spring-boot,unit-testing,Java,Spring Boot,Unit Testing,我想测试我的寄存器控制器,我得到了错误,bcz发布的数据没有转换到我的模型,测试落在验证上 @PostMapping(value = "/register", consumes = "application/json") @ResponseStatus(HttpStatus.CREATED) private String postRegistration( @ModelAttribute @Valid final UserCreateFormDto user, final Bi
@PostMapping(value = "/register", consumes = "application/json")
@ResponseStatus(HttpStatus.CREATED)
private String postRegistration( @ModelAttribute @Valid final UserCreateFormDto user, final BindingResult result,
final RedirectAttributes redirectAttributes, final WebRequest webRequest) {
if (result.hasErrors()) {
redirectAttributes.addFlashAttribute("org.springframework.validation.BindingResult.user", result);
redirectAttributes.addFlashAttribute("user", user);
return "redirect:/register";
}
if (userService.checkEmailExist(user.getEmail())) {
return "redirect:/register?exist";
}
final User registered = userService.createNewUserAccount(user);
try {
final String appUrl = webRequest.getContextPath();
eventPublisher.publishEvent(new RegistrationCompleteEvent(registered, webRequest.getLocale(), appUrl));
return "redirect:/login?success";
} catch (UserNotExistsException e) {
return "redirect:/register";
}
}
和测试
@Test
public void shouldReturnHttp201WhenUserIsCreated() throws Exception {
//given
final UserCreateFormDto userCreateFormDto = createUserCreateForm();
final User user = createUser();
given(userService.checkEmailExist(userCreateFormDto.getEmail())).willReturn(false);
given(userService.createNewUserAccount(any(UserCreateFormDto.class))).willReturn(user);
//when
final MockHttpServletResponse response = mockMvc
.perform(post("/register").with(csrf())
.contentType(MediaType.APPLICATION_JSON_UTF8)
.content(objectMapper.writeValueAsString(userCreateFormDto)))
.andReturn()
.getResponse();
//then
assertThat(response.getStatus()).isEqualTo(HttpStatus.CREATED.value());
assertThat(response.getContentAsString()).isEqualTo(userJacksonTester.write(user).getJson());
verify(userService).createNewUserAccount(refEq(userCreateFormDto));
}
编辑
我试图模拟BindingResult,但在阅读更多内容后,这不是一个好主意。您想绑定表单输入字段还是JSON正文。您的测试针对后者,而您的控制器针对前者。如果要使用主体而不是表单,请使用
@RequestBody
而不是@modeldattribute
。我要绑定表单数据。我正在使用thymeleaf发布数据。因此,我的问题是如何将输入字段绑定到我的对象?然后不要使用内容
,而是在请求中添加参数以用于绑定。就像表单一样,它工作得很好!谢谢你,我的朋友。你帮了我很多!您想绑定表单输入字段还是JSON正文。您的测试针对后者,而您的控制器针对前者。如果要使用主体而不是表单,请使用@RequestBody
而不是@modeldattribute
。我要绑定表单数据。我正在使用thymeleaf发布数据。因此,我的问题是如何将输入字段绑定到我的对象?然后不要使用内容
,而是在请求中添加参数以用于绑定。就像表单一样,它工作得很好!谢谢你,我的朋友。你帮了我很多!