Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 测试Spring MVC控制器的问题_Java_Spring_Unit Testing_Spring Mvc_Spring Boot - Fatal编程技术网

Java 测试Spring MVC控制器的问题

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

我有下面的控制器方法。用户提交包含4个输入字段的搜索表单,并且必须至少填写其中一个字段。如果所有字段都为空(使用验证程序),则表单顶部(在同一页面中)将显示一个错误

否则,它将使用服务方法查找用户并在表单底部(在同一页面中)显示结果。这就是为什么在if语句中我返回相同的页面以及方法的结尾,因为无论发生什么,用户都指向相同的页面

@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'