Assim como a classe ValidacaoTutorComAdocaoEmAndamento, a classe ValidacaoTutorComLimiteDeAdocoes apresenta um código diferente do código testado na primeira resolução dos desafios. O código presente no projeto para download está desta forma:
@Component
public class ValidacaoTutorComLimiteDeAdocoes implements ValidacaoSolicitacaoAdocao {
@Autowired
private AdocaoRepository adocaoRepository;
@Autowired
private TutorRepository tutorRepository;
public void validar(SolicitacaoAdocaoDto dto) {
List<Adocao> adocoes = adocaoRepository.findAll();
Tutor tutor = tutorRepository.getReferenceById(dto.idTutor());
for (Adocao a : adocoes) {
int contador = 0;
if (a.getTutor() == tutor && a.getStatus() == StatusAdocao.APROVADO) {
contador = contador + 1;
}
if (contador == 5) {
throw new ValidacaoException("Tutor chegou ao limite máximo de 5 adoções!");
}
}
}
}
De inicio podemos reparar em uma correção necessária para que a validação funcione, sendo ela remover a iniciação da variável contador de dentro do laço for e adiciona-la antes do inicio do mesmo, caso contrário ela será sempre zerada para cada elemento percorrido na lista e sua incrementação não passará de 1:
@Component
public class ValidacaoTutorComLimiteDeAdocoes implements ValidacaoSolicitacaoAdocao {
@Autowired
private AdocaoRepository adocaoRepository;
@Autowired
private TutorRepository tutorRepository;
public void validar(SolicitacaoAdocaoDto dto) {
List<Adocao> adocoes = adocaoRepository.findAll();
Tutor tutor = tutorRepository.getReferenceById(dto.idTutor());
int contador = 0;
for (Adocao a : adocoes) {
if (a.getTutor() == tutor && a.getStatus() == StatusAdocao.APROVADO) {
contador = contador + 1;
}
if (contador == 5) {
throw new ValidacaoException("Tutor chegou ao limite máximo de 5 adoções!");
}
}
}
}
Por fim, os testes desenvolvidos para cobrir os casos possíveis dessa classe de validação foram implementados da seguinte maneira:
@ExtendWith(MockitoExtension.class)
class ValidacaoTutorComLimiteDeAdocoesTest {
@InjectMocks
private ValidacaoTutorComLimiteDeAdocoes validacaoTutorComLimiteDeAdocoes;
@Mock
private AdocaoRepository adocaoRepository;
@Mock
private TutorRepository tutorRepository;
@Mock
private SolicitacaoAdocaoDto dto;
@Mock
private Tutor tutor;
@Mock
private Pet pet;
@Spy
private List<Adocao> listaDeAdocoes = new ArrayList<>();
@Spy
private Adocao adocao;
@Test
void deveriaPermitirAdocaoPorTutorComLimite() {
adocao = new Adocao(tutor, pet, "Motivo qualquer");
adocao.marcarComoAprovada();
listaDeAdocoes.add(adocao);
BDDMockito.given(adocaoRepository.findAll()).willReturn(listaDeAdocoes);
BDDMockito.given(tutorRepository.getReferenceById(dto.idTutor())).willReturn(tutor);
Assertions.assertDoesNotThrow(() -> validacaoTutorComLimiteDeAdocoes.validar(dto));
}
@Test
void deveriaNaoPermitirAdocaoPorTutorSemLimite() {
adocao = new Adocao(tutor, pet, "Motivo qualquer");
adocao.marcarComoAprovada();
for(int i = 0; i < 5; i++)
listaDeAdocoes.add(adocao);
BDDMockito.given(adocaoRepository.findAll()).willReturn(listaDeAdocoes);
BDDMockito.given(tutorRepository.getReferenceById(dto.idTutor())).willReturn(tutor);
Assertions.assertThrows(ValidacaoException.class, () -> validacaoTutorComLimiteDeAdocoes.validar(dto));
}
}
Gostaria de um feedback sobre minha implementação dos testes e também disponibilizar o código para os demais alunos com dificuldade nessa etapa.