1
resposta

Erro com mock e spring security

Professor, estou usando o mock com spring security, e sem sucesso, comecou com erro 403, depois 401 e depois de várias configurações agora estou tendo erro 400.

Minha classe

@RestController
@RequestMapping(value = "/api/clientes/pf")
public class PessoaFisicaResource {

    private final PessoaFisicaService pessoaFisicaService;

    @Autowired
    public PessoaFisicaResource(PessoaFisicaService pessoaFisicaService) {
        this.pessoaFisicaService = pessoaFisicaService;
    }

    @GetMapping(value = "/{id}")
    public ResponseEntity<PessoaFisica> buscar(@PathVariable Long id) {
        PessoaFisica pessoaFisica = pessoaFisicaService.buscar(id);
        return ResponseEntity.ok().body(pessoaFisica);
    }

    @GetMapping
    public ResponseEntity<List<PessoaFisicaDtoBuscar>> buscarTodos() {
        List<PessoaFisica> pessoaFisica = pessoaFisicaService.buscarTodos();
        List<PessoaFisicaDtoBuscar> pessoaFisicaDtoBuscar = pessoaFisica.stream().map(objeto -> new PessoaFisicaDtoBuscar(objeto))
                .collect(Collectors.toList());
        return ResponseEntity.ok().body(pessoaFisicaDtoBuscar);
    }

    @GetMapping(value = "/pagina")
    public ResponseEntity<Page<PessoaFisicaDtoBuscar>> buscaPagina(
            @RequestParam(value = "pagina", defaultValue = "0") Integer pagina,
            @RequestParam(value = "linhasPorPagina", defaultValue = "24") Integer linhasPorPagina,
            @RequestParam(value = "direcaoDeOrdenacao", defaultValue = "ASC") String direcaoDeOrdenacao,
            @RequestParam(value = "ordenarPor", defaultValue = "nome") String ordenarPor) {
        Page<PessoaFisica> pessoaFisicas = pessoaFisicaService.buscarPagina(pagina, linhasPorPagina, direcaoDeOrdenacao, ordenarPor);
        Page<PessoaFisicaDtoBuscar> pessoaFisicaDtoBuscar = pessoaFisicas.map(objeto -> new PessoaFisicaDtoBuscar(objeto));
        return ResponseEntity.ok().body(pessoaFisicaDtoBuscar);
    }

    @PostMapping
    public ResponseEntity<Void> inserir(@Valid @RequestBody PessoaFisicaDto pessoaFisicaDto) {
        PessoaFisica pessoaFisica = pessoaFisicaService.converteDeDto(pessoaFisicaDto);
        pessoaFisica = pessoaFisicaService.inserir(pessoaFisica);
        URI uri = ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}").buildAndExpand(pessoaFisica.getId())
                .toUri();
        return ResponseEntity.created(uri).build();
    }

    @PutMapping(value = "/{id}")
    public ResponseEntity<Void> atualizar(@Valid @RequestBody PessoaFisicaDto pessoaFisicaDto, @PathVariable Long id) {
        PessoaFisica pessoaFisica = pessoaFisicaService.converteDeDto(pessoaFisicaDto);
        pessoaFisica.setId(id);
        pessoaFisica = pessoaFisicaService.atualizar(pessoaFisica);
        return ResponseEntity.noContent().build();
    }

    @DeleteMapping(value = "/{id}")
    public ResponseEntity<Void> apagar(@PathVariable Long id) {
        pessoaFisicaService.apagar(id);
        return ResponseEntity.noContent().build();
    }
}

Meu teste

@RunWith(SpringRunner.class)
@SpringBootTest(value = "SpringBootTest.WebEnvironment.MOCK")
@AutoConfigureMockMvc
public class PessoaFisicaResourceTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private PessoaFisicaService pessoaFisicaService;

    @Test
    @WithMockUser(username = "sa")
    public void criarNovoClientePessoaFisica() throws Exception {
        PessoaFisica mockPessoaFisica = new PessoaFisica(1L, (byte) 1L, 1L, "Rodrigo Batista", "012.668.833-80", "12346 SSPMA",
                "rodrigo@bitis.com.br", new Date(), GeneroEnum.MASCULINO, EstadoCivilEnum.CASADO, new Date(), 1L, 1L);

        EnderecoPessoaFisica enderecoPessoaFisica = new EnderecoPessoaFisica(1L, "a", "b", "12", "S/C", "0000-123", new Cidade(), mockPessoaFisica);
        TelefonePessoaFisica telefonePessoaFisica = new TelefonePessoaFisica(1L, "123", TipoDeTelefoneEnum.CELULAR, mockPessoaFisica);
        mockPessoaFisica.getEnderecos().add(enderecoPessoaFisica);
        mockPessoaFisica.getTelefones().add(telefonePessoaFisica);

        Mockito.when(pessoaFisicaService.inserir(Mockito.any(PessoaFisica.class))).thenReturn(mockPessoaFisica);
        ObjectWriter objectWriter = new ObjectMapper().writer().withDefaultPrettyPrinter();
        String mockPessoaFisicaJson = objectWriter.writeValueAsString(mockPessoaFisica);

        this.mockMvc.perform(MockMvcRequestBuilders.post("/api/clientes/pf")
                .with(SecurityMockMvcRequestPostProcessors.csrf())
                .contentType(MediaType.APPLICATION_JSON_UTF8)
                .accept(MediaType.APPLICATION_JSON_UTF8)
                .content(mockPessoaFisicaJson))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.content().json(mockPessoaFisicaJson));
    }
}
1 resposta

Fala Leonardo, tudo bem?

Você adicionou a dependência do spring-security-test no seu pom.xml?

Em vez de dar um @Autowired do seu mockMvc, faça a inicialização abaixo:

@Autowired
    private FilterChainProxy springSecurityFilterChain;

@Before
    public void setup() {
        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac)
          .addFilter(springSecurityFilterChain).build();
    }

Se sua API tiver oauth, você vai precisar passar o accessToken no header:

mockMvc.perform(post("/employee")
      .header("Authorization", "Bearer " + accessToken)
      .contentType(application/json;charset=UTF-8)
      .content(employeeString)
      .accept(application/json;charset=UTF-8))
      .andExpect(status().isCreated());

Abraço!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software