3
respostas

AssertionError em teste de autenticação com dados válidos

Olá! Resolvi testar a função de autenticação com dados válidos retornando status 200, porém está retornando status 400. =(

Segue o código do teste:

@Test
    public void autenticar_withAValidEmail_mustReturn200() throws Exception {
        URI uri = new URI("/auth");
        String json = "{\"email\"=\"aluno@email.com\", \"senha\"=\"123456\"}";

        mockMvc.perform(MockMvcRequestBuilders
                        .post(uri)
                        .content(json)
                        .contentType(org.springframework.http.MediaType.APPLICATION_JSON))
                .andExpect(MockMvcResultMatchers
                        .status()
                        .is(200)).andExpect(MockMvcResultMatchers.jsonPath("$.tipo").value("Bearer"))
                .andExpect(MockMvcResultMatchers.jsonPath("$.token").isString());
    }

arquivo data.sql:

INSERT INTO USUARIO(nome, email, senha) VALUES('Aluno', 'aluno@email.com', '$2a$10$sFKmbxbG4ryhwPNx/l3pgOJSt.fW1z6YcUnuE2X8APA/Z3NI/oSpq');

resultado do teste:

java.lang.AssertionError: Response status 
Expected :200
Actual   :400

Obs.: O teste de autenticação com dados inválidos retornando status 400 realizado junto com o instrutor no vídeo está passando corretamente aqui.

Poderia me ajudar, por favor?

3 respostas

Oi Gabriela,

Acho que o problema está no seu json:

String json = "{\"email\"=\"aluno@email.com\", \"senha\"=\"123456\"}";

Está com símbolo de = ao invés de :

String json = "{\"email\":\"aluno@email.com\", \"senha\":\"123456\"}";

Olá, professor!

Fiz o teste com o json certo agora, porém deu o mesmo erro.

@Test
    public void autenticar_withAValidEmail_mustReturn200() throws Exception {
        URI uri = new URI("/auth");
      String json = "{\"email\":\"aluno@email.com\", \"senha\":\"123456\"}";

        mockMvc.perform(MockMvcRequestBuilders
                        .post(uri)
                        .content(json)
                        .contentType(org.springframework.http.MediaType.APPLICATION_JSON))
                .andExpect(MockMvcResultMatchers
                        .status()
                        .is(200));
    }

Segue o erro que aparece no terminal:

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /auth
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8"]
             Body = {"email":"aluno@email.com", "senha":"123456"}
    Session Attrs = {}

Handler:
             Type = br.com.alura.forum.controller.AutenticacaoController
           Method = public org.springframework.http.ResponseEntity<br.com.alura.forum.controller.dto.TokenDto> br.com.alura.forum.controller.AutenticacaoController.autenticar(br.com.alura.forum.controller.form.LoginForm)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 400
    Error message = null
          Headers = [X-Content-Type-Options:"nosniff", X-XSS-Protection:"1; mode=block", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = null
             Body = 
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

java.lang.AssertionError: Response status 
Expected :200
Actual   :400

Minha função de autenticar no controller:

@RestController
@RequestMapping("/auth")
@Profile(value = {"prod", "test"})
public class AutenticacaoController {

    @Autowired
    private AuthenticationManager authManager;

    @Autowired
    private TokenService tokenService;

    @PostMapping
    public ResponseEntity<TokenDto> autenticar(@RequestBody @Valid LoginForm form) {
        UsernamePasswordAuthenticationToken dadosLogin = form.converter();

        try {
            Authentication authentication = authManager.authenticate(dadosLogin);
            String token = tokenService.gerarToken(authentication);
            return ResponseEntity.ok(new TokenDto(token, "Bearer"));
        } catch (AuthenticationException e) {
            return ResponseEntity.badRequest().build();
        }
    }
}

Oi Gabriela,

Coloca essa linha no seu catch do método no controller:

} catch (AuthenticationException e) {
    e.printStacktrace();
    return ResponseEntity.badRequest().build();
}

E depois que rodar o teste veja no console qual erro está ocorrendo.