1
resposta

[Dúvida] Cobertura de testes da classe AbrigoService

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

}
1 resposta

Oii Leandro, tudo bem?

É importante ressaltar que a cobertura de testes vai depender muito do que se espera do código e dos cenários que você considera importantes para o seu negócio. No curso, a cobertura de testes apresentada pode não ter abrangido todos os cenários possíveis, mas focou nos principais cenários que poderiam ocorrer.

Mas, você tá correto ao dizer que outros cenários poderiam ser testados. A cobertura de testes é um tópico bastante amplo e a decisão de quais casos testar pode variar bastante. A sua proposta de resolução me parece bem completa e não acho que você exagerou nos casos de teste. Pelo contrário, você fez um bom trabalho ao considerar vários cenários diferentes!

E isso é muito bom pra praticar! Parabéns!

Um abraço e bons estudos.