我想通过MockMvc测试此方法

    @RequestMapping("/saveCandidate")
        public String saveCandidate(
                Model model,
                @ModelAttribute("candidateFromRequest") @Validated()  Candidate candidateFromRequest,
                BindingResult result,
                @ModelAttribute("skillsIdList") Set<Skill> skills,
                @ModelAttribute("vacanciesForCandidate") Set<Vacancy> vacanciesForCandidate,
                @ModelAttribute("eventsForCandidate") Set<Event> eventsForCandidate,
                RedirectAttributes redirectAttributes){
...


}


如何将BindingResult结果的模拟从测试方法传递到saveCandidate方法?

我的测试方法:

        @Test
            public void saveCandidateWithErrors() throws Exception{
                BindingResult result= mock(BindingResult.class);

                when(result.hasErrors()).thenReturn(true);
                when(candidateService.findByName(anyString())).thenReturn(new ArrayList<Candidate>());

                MockHttpServletRequestBuilder request = MockMvcRequestBuilders.get("/saveCandidate");
         if(result.hasErrors())
                  //how test code that writing here?
        }
         else{
             //I always hit it here
       }
}


我想设置为模拟结果

最佳答案

您不能(可以,但是不值得麻烦)。 BindingResult是Spring在创建命令对象时创建的对象,并在调用saveCandidate处理程序方法时将其传递。

您不应测试Spring提供的类和对象,而应测试输入正确或错误的请求参数时如何解析它们。



要解释为什么它不值得:

除其他外,Spring使用堆栈的HandlerMethodArgumentResolverRequestMappingHandlerMappingHandlerMethod实例来处理到达DispatcherServlet的请求。模拟BindingResult很可能意味着必须模拟或子类化所有这些。

10-07 17:54