Java 测试Spring MVC控制器的问题
我有下面的控制器方法。用户提交包含4个输入字段的搜索表单,并且必须至少填写其中一个字段。如果所有字段都为空(使用验证程序),则表单顶部(在同一页面中)将显示一个错误 否则,它将使用服务方法查找用户并在表单底部(在同一页面中)显示结果。这就是为什么在if语句中我返回相同的页面以及方法的结尾,因为无论发生什么,用户都指向相同的页面Java 测试Spring MVC控制器的问题,java,spring,unit-testing,spring-mvc,spring-boot,Java,Spring,Unit Testing,Spring Mvc,Spring Boot,我有下面的控制器方法。用户提交包含4个输入字段的搜索表单,并且必须至少填写其中一个字段。如果所有字段都为空(使用验证程序),则表单顶部(在同一页面中)将显示一个错误 否则,它将使用服务方法查找用户并在表单底部(在同一页面中)显示结果。这就是为什么在if语句中我返回相同的页面以及方法的结尾,因为无论发生什么,用户都指向相同的页面 @RequestMapping(value="/search", method={RequestMethod.POST}) public ModelAndView
@RequestMapping(value="/search", method={RequestMethod.POST})
public ModelAndView searchUser(@ModelAttribute("searchUserDTO")SearchUserDTO searchUserDTO, BindingResult bindingResult, ModelMap modelMap){
validate(searchUserDTO, bindingResult);
List<BlueUser> users = new ArrayList<>();
if (bindingResult.hasErrors()) {
modelMap.put("searchUserDTO", searchUserDTO);
return new ModelAndView(VIEW_USERS, modelMap);
} else {
users = BlueUserService.findUsers(searchUserDTO.getMyName, searchUserDTO.getSSID(), searchUserDTO.getPostcode(), new Email(searchUserDTO.getMail()));
}
modelMap.put("searchUserDTO", users);
return new ModelAndView(VIEW_USERS, modelMap);
}
我使用拒绝
返回全局范围内的错误,而不是特定字段和以下测试方法上的错误:
public static final String BINDING_RESULT = BindingResult.class.getName() + '.' + "searchUserDTO";
@Test
public void searchUserPOST() throws Exception{
MultiValueMap<String, String> paramMap = mockMVCTestUtil.createParamMap("myName", null,
"ssid", null,
"postcode", null,
"mail", null);
MvcResult mvcResult = this.mockMvc.perform(
post("/search")
.params(paramMap))
.andExpect(model().attributeExists("searchUserDTO"))
.andExpect(model().attributeHasErrors("searchUserDTO"))
.andExpect(status().isOk())
.andExpect(redirectedUrl(VIEW_USERS))
.andExpect(forwardedUrl(VIEW_USERS))
.andReturn();
BindingResult bindingResult = (BindingResult) mvcResult.getModelAndView().getModel().get(BINDING_RESULT);
assertNotNull(bindingResult);
assertGlobalErrorMessage(bindingResult, "Please fill in the form");
}
我做错了什么?能否在public void validate(..)中设置断点,并检查target/dto的哪些属性为非空?也许是SSID,请注意。@AlbertHendriks我已经这样做了,属性为空。如果替换
错误,它是否有效。拒绝(空,“请填写表单”)代码>由错误。拒绝属性(“邮件”,“请填写表格”)
和.andExpect(model().attributeHasErrors(“searchUserDTO”)
by和expect(model().attributeHasErrors(“mail”)
?相反,您也可以尝试将空的替换为“searchUserDTO”
,并调用拒绝属性
,而不是拒绝。什么是mockMVCTestUtil?2.是否存在大小写问题:ssid
vs.dto.getSSID()
?
public static final String BINDING_RESULT = BindingResult.class.getName() + '.' + "searchUserDTO";
@Test
public void searchUserPOST() throws Exception{
MultiValueMap<String, String> paramMap = mockMVCTestUtil.createParamMap("myName", null,
"ssid", null,
"postcode", null,
"mail", null);
MvcResult mvcResult = this.mockMvc.perform(
post("/search")
.params(paramMap))
.andExpect(model().attributeExists("searchUserDTO"))
.andExpect(model().attributeHasErrors("searchUserDTO"))
.andExpect(status().isOk())
.andExpect(redirectedUrl(VIEW_USERS))
.andExpect(forwardedUrl(VIEW_USERS))
.andReturn();
BindingResult bindingResult = (BindingResult) mvcResult.getModelAndView().getModel().get(BINDING_RESULT);
assertNotNull(bindingResult);
assertGlobalErrorMessage(bindingResult, "Please fill in the form");
}
Forwarded URL = null
Redirected URL = null
Cookies = []
java.lang.AssertionError: No errors for attribute 'searchUserDTO'