我想通过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使用堆栈的HandlerMethodArgumentResolver
,RequestMappingHandlerMapping
和HandlerMethod
实例来处理到达DispatcherServlet
的请求。模拟BindingResult
很可能意味着必须模拟或子类化所有这些。