Com o curso Spring MVC II finalizado, creio que a versão final do método de salvar um produto termine assim:
@RequestMapping(method=RequestMethod.POST)
@CacheEvict(value="productsHome", allEntries=true)
public ModelAndView saveProduct(MultipartFile file, @Valid Product product, BindingResult result, RedirectAttributes redirectAttributes) {
System.out.println(file.getOriginalFilename());
if (result.hasErrors()) {
System.out.println(result.getFieldError());
return form(product);
}
String path = fileSaver.write("fileLocation", file);
product.setFileLocation(path);
productDAO.save(product);
redirectAttributes.addFlashAttribute("bookAddedMessage", "Product " + product.getTitle() + " added with success.");
return new ModelAndView("redirect:/products");
}
Como seria o teste escrito para este método? Os dois testes explorados no curso foram:
@Test
public void mustReturnToHomeWithBooks() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("/"))
.andExpect(MockMvcResultMatchers.model().attributeExists("products"))
.andExpect(MockMvcResultMatchers.forwardedUrl("/WEB-INF/views/products/home.jsp"));
}
@Test
public void onlyAdminUsersShouldAccessForm() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("/products/form")
.with(SecurityMockMvcRequestPostProcessors
.user("user@bookstore.com.br").password("123456")
.roles("USER")))
.andExpect(MockMvcResultMatchers.status().is(403));
}
Gostaria muito de receber uma ajuda aqui para escrever um teste para este método que salva um produto.
A dificuldade em criar um produto e como inserir o parâmetro que representa esse produto na requisição mockada que está sendo feita, e ainda testando o método de "ponta-a-ponta", pois o mesmo recebe um produto, salva no banco e redireciona para uma nova view.
Ou seja, bem diferente do que apenas testar um metódo que recebe uma requisição e faz um forward...
Pela dificuldade que tive inicialmente, estou achando que ficará muito mais fácil para eu fazer um teste de aceitação para esse formulário tão importante na aplicação, pois assim esse teste já validará tudo, desde o binding result até o redirecionamento.
A saída é essa mesmo ou existe como testar esse método sem ser via teste de aceitação?