2
respostas

Como testar um método que recebe um Principal como parâmetro?

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");

    }
2 respostas

Opa, qual o erro que dá quando você executa o teste? De todo jeito, você pode trocar esse parâmetro por um objeto do tipo Usuario e anotar o parâmetro com @AuthenticationPrincipal.

O erro que dá é: java.lang.AssertionError: Response status expected:<302> but was:<403>

Eu não entendi essa ideia de trocar o parâmetro e anota-lo.

Teria como você escrever esse código aqui, ajudaria demais já que esse é o único impedimento que eu tenho para continuar escrevendo testes para a aplicação, da mesma maneira que eu fazia antes de receber o usuário logado através da java.security.Principal.

Grato!