Consegui realizar com sucesso em minha aplicação os testes exibidos durante o curso Spring MVC II.
No entanto, recebo como parâmetro o usuário logado na aplicação através da interface java.security.Principal. Ou seja, além de executar o teste utilizando um RequestPostProcessor passando o usuário, senha e o role, o método tem que receber como parâmetro um objeto do tipo Principal.
Como faço criar e passar esse objeto ? Segue o método abaixo:
@RequestMapping(value = "/gravaCondominio", method = RequestMethod.POST)
public ModelAndView gravaCondominio(Principal principal, @Valid Condominio condominio, BindingResult result, RedirectAttributes redirectAttributes) {
if (result.hasErrors()) {
return formCondominio(condominio);
}
Usuario usuario = usuarioDAO.getUsuarioByEmail(principal.getName());
condominio.getUsuarios().add(usuario);
condominio.setUsuarioCriador(usuario);
condominioDAO.grava(condominio);
redirectAttributes.addFlashAttribute("msgSucesso", "Condomínio com nome: " + condominio.getNome() + " foi cadastrado com sucesso.");
ModelAndView modelAndView = new ModelAndView("redirect:gerenciaDeCondominio");
modelAndView.addObject("condominioId", condominio.getId());
return modelAndView;
}
Segue também o teste que estou escrevendo, mas da forma como está recebo um 403 ao invés de um 302 como deveria ser...
@Test
@Transactional
public void deveInserirUmCondominio() throws Exception {
RequestPostProcessor processor = SecurityMockMvcRequestPostProcessors.user("usuarioNaoExistente").password("123456").roles("PADRAO");
MockHttpServletRequestBuilder request = MockMvcRequestBuilders
.post("/gravaCondominio")
.contentType(MediaType.APPLICATION_FORM_URLENCODED)
.param("nome", "Mosaico Mall")
.param("telefoneComercial1", "4040-5050")
.param("endereco.logradouro", "av. João Silva")
.param("endereco.numero", "300")
.param("endereco.cep", "88822-550")
.param("endereco.complemento", "prédio comercial")
.param("endereco.bairro", "Bairro")
.param("endereco.cidade", "Cidade")
.param("endereco.estado", "Estado");
mockMvc.perform(request.with(processor))
.andExpect(MockMvcResultMatchers.status().is(302))
.andExpect(MockMvcResultMatchers.redirectedUrl("listaCondominios"));
int tamanhoDaLista = condominioDAO.getListaDeCondominios(2).size();
List<Condominio> lista = condominioDAO.getListaDeCondominios(2);
assertEquals(lista.get((tamanhoDaLista) -1).getNome(), "Mosaico Mall");
}