Olá! Estou com dúvidas para fazer testes para métodos update. Eu tentei testar estes cenários, tanto de erro, como de sucesso, está retornando erro 500, ao invés dos códigos que selecionei (200 e 404). Para o erro 404, eu tentei criar, colocando um id inesperado, tentando simular que não existe, mas retorna nulo. O mesmo processo está acontecendo, quando estou fazendo para o cenário de sucesso. Vou te passar os códigos que criei como estou fazendo, junto com o método controller, que precisa ser testado. Poderiam me ajudar, por favor?
@RestController
@RequestMapping("beneficiaries")
@SecurityRequirement(name = "bearer-key")
public class BeneficiarioController {
@PutMapping
@Transactional
public ResponseEntity updateBeneficiary(@RequestBody @Valid DadosAtualizacaoBeneficiario dados) {
var beneficiario = beneficiarioRepository.getReferenceById(dados.id());
beneficiario.atualizarInformacoes(dados);
return ResponseEntity.ok(new DadosDetalhamentoBeneficiario(beneficiario));
}
}
@Test
@DisplayName("Deveria devolver código http 404, quando as informações estão inválidas")
@WithMockUser
void updateBeneficiaryCenario1() throws Exception {
Long id = 2L;
var repository = beneficiarioRepository;
repository.getReferenceById(id);
when(repository.getReferenceById(anyLong())).thenThrow(EntityNotFoundException.class);
// simulando que o id não existe
// given(repository).willThrow(EntityNotFoundException.class);
var response = mvc
.perform(
put("/beneficiaries/{id}", id)
)
.andReturn().getResponse();
assertThat(response.getStatus()).isEqualTo(HttpStatus.NOT_FOUND.value());
}
@Test
@DisplayName("Deveria devolver código http 200, quando as informações estiverem válidas")
@WithMockUser
void updateBeneficiaryCenario2() throws Exception {
Long id = 1L;
DadosAtualizacaoDocumento dadosAtualizacaoDocumento = new DadosAtualizacaoDocumento(
5L,
TipoDocumento.CARTEIRA_IDENTIDADE,
"43789563",
LocalDate.parse("2019-09-18"),
"Test description",
LocalDate.parse("2024-04-16"),
LocalDate.parse("2024-04-16"));
DadosEndereco dadosEndereco = new DadosEndereco("Rua xpto", "Bairro", "12345-789", "Cidade", "SP", "Casa", "789");
DadosAtualizacaoBeneficiario dadosAtualizacaoBeneficiario = new DadosAtualizacaoBeneficiario(
null,
"Nome",
"112345678",
dadosEndereco,
Collections.singletonList(dadosAtualizacaoDocumento)
);
// considerando que sua classe Endereco tenha um construtor que receba um objeto DadosEndereco:
var enderecoEsperado = new Endereco(dadosAtualizacaoBeneficiario.endereco());
// considerando que sua classe DadosDetalhamentoDocumento tenha um construtor que receba uma lista DadosCadastroDocumento:
List<DadosDetalhamentoDocumento> documentosEsperados = dadosAtualizacaoBeneficiario.documentos().stream().map(DadosDetalhamentoDocumento::new).toList();
DadosDetalhamentoBeneficiario dadosDetalhamentoBeneficiario = new DadosDetalhamentoBeneficiario(
null,
dadosAtualizacaoBeneficiario.nome(),
dadosAtualizacaoBeneficiario.telefone(),
null,
null,
null,
documentosEsperados,
enderecoEsperado);
var response = mvc
.perform(
put("/beneficiaries/{id}", id)
.contentType(MediaType.APPLICATION_JSON)
.content(dadosAtualizacaoBeneficiarioJson.write(dadosAtualizacaoBeneficiario).getJson())
)
.andReturn().getResponse();
assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());
String jsonEsperado = dadosDetalhamentoBeneficiarioJson.write(dadosDetalhamentoBeneficiario).getJson();
assertThat(response.getContentAsString()).isEqualTo(jsonEsperado);
}