Notei que a cobertura de testes da classe AbrigoService apresentada como resolução do desafio no curso não cobre nem metade dos cenários possíveis (incluindo cenários que foram testados durante o curso em outras classes), ou realmente acabei entendendo errado alguns conceitos apresentados no curso sobre o que deve ou não ser testado.
Acrescentei aos meus testes o teste do método listar()
, já que ele é apresentado na resolução, mas, segundo o que compreendi dos vídeos, esse método não precisaria ser testado já que não possui nenhuma regra de negócio ou query personalizada.
Vou deixar minha proposta de resolução abaixo para saber se exagerei nos casos de teste:
@ExtendWith(MockitoExtension.class)
class AbrigoServiceTest {
@InjectMocks
private AbrigoService service;
@Mock
private AbrigoRepository abrigoRepository;
@Mock
private PetRepository petRepository;
@Mock
private CadastroAbrigoDto dto;
@Captor
private ArgumentCaptor<Abrigo> captor;
@Mock
private Abrigo abrigo;
@Test
void deveriaRetronarUmaExcecaoAoCadastrarAbrigo() {
BDDMockito.given(abrigoRepository.
existsByNomeOrTelefoneOrEmail(dto.nome(), dto.telefone(), dto.email()))
.willReturn(true);
Assertions.assertThrows(ValidacaoException.class, () -> service.cadatrar(dto));
}
@Test
void naoDeveriaRetronarUmaExcecaoAoCadastrarAbrigo() {
BDDMockito.given(abrigoRepository.
existsByNomeOrTelefoneOrEmail(dto.nome(), dto.telefone(), dto.email()))
.willReturn(false);
Assertions.assertDoesNotThrow(() -> service.cadatrar(dto));
BDDMockito.then(abrigoRepository).should().save(captor.capture());
Abrigo abrigoCapturado = captor.getValue();
Assertions.assertEquals(captor.getValue().getEmail(), abrigoCapturado.getEmail());
Assertions.assertEquals(captor.getValue().getNome(), abrigoCapturado.getNome());
Assertions.assertEquals(captor.getValue().getTelefone(), abrigoCapturado.getTelefone());
}
@Test
void deveriaListarTodosOsAbrigos() {
service.listar();
BDDMockito.then(abrigoRepository).should().findAll();
}
@Test
void naoDeveriaCarregarAbrigoPeloNomeERetornarUmaExcecao() {
String nome = "nome";
BDDMockito.given(abrigoRepository.findByNome(nome)).willReturn(Optional.empty());
Assertions.assertThrows(ValidacaoException.class, () -> service.carregarAbrigo(nome));
}
@Test
void naoDeveriaCarregarAbrigoPeloIdERetornarUmaExcecao() {
String nome = "2";
BDDMockito.given(abrigoRepository.findById(Long.parseLong(nome))).willReturn(Optional.empty());
Assertions.assertThrows(ValidacaoException.class, () -> service.carregarAbrigo(nome));
}
@Test
void deveriaCarregarAbrigoPeloNome() {
String nome = "Nome";
BDDMockito.given(abrigoRepository.findByNome(nome)).willReturn(Optional.of(abrigo));
Assertions.assertEquals(abrigo, service.carregarAbrigo(nome));
}
@Test
void deveriaCarregarAbrigoPeloId() {
String nome = "1";
BDDMockito.given(abrigoRepository.findById(Long.parseLong(nome))).willReturn(Optional.of(abrigo));
Assertions.assertEquals(abrigo, service.carregarAbrigo(nome));
}
}