3
respostas

[Dúvida] Expected Validation but nothing to be throw

Olá!

Estou tentando identificar um erro que está dando na ValidacaoTutorComLimiteTest mas não consigo. Segue código do Teste e da classe original...

package br.com.alura.adopet.api.validacoes;

import br.com.alura.adopet.api.dto.SolicitacaoAdocaoDto; import br.com.alura.adopet.api.exception.ValidacaoException; import br.com.alura.adopet.api.model.StatusAdocao; import br.com.alura.adopet.api.repository.AdocaoRepository; import br.com.alura.adopet.api.repository.TutorRepository; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension;

import static org.junit.jupiter.api.Assertions.*; import static org.mockito.BDDMockito.given;

@ExtendWith(MockitoExtension.class) class ValidacaoTutorComLimiteDeAdocoesTest {

@InjectMocks
private ValidacaoTutorComLimiteDeAdocoes validador;

@Mock
private AdocaoRepository adocaoRepository;

@Mock
private TutorRepository tutorRepository;

@Mock
private SolicitacaoAdocaoDto dto;

@Test
@DisplayName("Não deveria permitir solicitação para tutor cujo limite de adoções foi atingido.")
void naoDeveriaPermitirSolicitacaoPorLimite() {

    //ARRANGE
    given(adocaoRepository.countByTutorIdAndStatus(dto.idTutor(), StatusAdocao.APROVADO)).willReturn(5);

    //ACT + ASSERT
    assertThrows(ValidacaoException.class, () -> validador.validar(dto));
}

}

package br.com.alura.adopet.api.validacoes;

import br.com.alura.adopet.api.dto.SolicitacaoAdocaoDto; import br.com.alura.adopet.api.exception.ValidacaoException; import br.com.alura.adopet.api.model.Adocao; import br.com.alura.adopet.api.model.StatusAdocao; import br.com.alura.adopet.api.model.Tutor; import br.com.alura.adopet.api.repository.AdocaoRepository; import br.com.alura.adopet.api.repository.TutorRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component;

import java.util.List;

@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!");
        }
    }
}

}

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

3 respostas

Alguém pra me auxiliar?

No aguardo.

Boa noite, João! Tudo certo?

João, seguinte, primeira coisa que acredito que pode estar te atrapalhando é que o contador tá dentro do for e por isso, nunca vai ficar igual a 5.

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

Coloca assim:

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

Outra coisa é que o intellij habilita você colocar breakpoint nos métodos mesmo no caso de execução de teste, isso pode te ajudar a identificar caso algo a mais não saia como esperado. Coloca os breakpoints no métodos validar e roda o teste no modo debug.

Espero ter ajudado!

Não só isso vai resolver pelo que vi, dei uma olhada na aula e o método do instrutor tá assim:

package br.com.alura.adopet.api.validacoes;

import br.com.alura.adopet.api.dto.SolicitacaoAdocaoDto;
import br.com.alura.adopet.api.exception.ValidacaoException;
import br.com.alura.adopet.api.model.Adocao;
import br.com.alura.adopet.api.model.StatusAdocao;
import br.com.alura.adopet.api.model.Tutor;
import br.com.alura.adopet.api.repository.AdocaoRepository;
import br.com.alura.adopet.api.repository.TutorRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
public class ValidacaoTutorComLimiteDeAdocoes implements ValidacaoSolicitacaoAdocao {

    @Autowired
    private AdocaoRepository adocaoRepository;

    public void validar(SolicitacaoAdocaoDto dto) {
        Integer adocoesTutor = adocaoRepository.countByTutorIdAndStatus(dto.idTutor(), StatusAdocao.APROVADO);

        if (adocoesTutor == 5) {
            throw new ValidacaoException("Tutor chegou ao limite máximo de 5 adoções!");
        }
    }

}

Então para ele faz sentido 'mockar' o resultado de adocaoRepository.countByTutorIdAndStatus, no seu caso, você não tá usando dessa forma, você precisaria 'mockar' o adocaoRepository.findAll() e tutorRepository.getReferenceById(dto.idTutor()) para que entrasse em um cenário que o contador ficasse igual a 5 (tirando o for de dentro dele, conforme o que mandei antes).

Espero ter ajudado!