2

我想通过 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
       }
}

我想设置为我的模拟结果

4

1 回答 1

3

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

你不应该测试 Spring 提供的类和对象,你应该测试当你输入正确或错误的请求参数时它们是如何解决的。


解释为什么不值得:

Spring 使用堆栈HandlerMethodArgumentResolverRequestMappingHandlerMappingHandlerMethod实例等来处理到达DispatcherServlet. 模拟aBindingResult很可能意味着必须模拟或继承所有这些。

于 2013-10-04T13:40:19.543 回答