我想通过 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){
...
}
如何将绑定结果的模拟从测试方法传递到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
很可能意味着必须嘲笑或子类所有这些。