1
resposta

Teste da classe LanceDao

Boa tarde, ao testar a classe percebi que não estava conseguindo localizar qual parte do teste estava sendo executada, nas validações, no método ehUmLanceValido(Lance lance), resolvi então extrair para outras classes usando padrão de projeto aprendido no curso anterior, só que estou com dúvida, se esse padrão seria o composite ou não? Também fiquei na dúvida de qual exceção usar, decidi usar IllegalArgumentException por entender que o lance estaria invalido e não seria permitido, como se decide esse tipo de coisa?

desde já obrigado.

public interface ValidarLance {    
    public Boolean validar(Lance lance);
}
public class LanceValidador implements ValidarLance{

    private List<ValidarLance> validadores;

    private List<String> mensagensDeErro = new ArrayList<String>();

    public LanceValidador() {
        validadores = Arrays.asList(
                new LanceEhMaiorQueOAnterior(),
                new LancePodeSerRealizadoPoisLeilaoEstaAberto(),
                new LanceFeitoPorUsuarioDiferente(),
                new LanceNaoEhMenorQueOValorInicialDoLeilao(),
                new LanceNaoPossuiDataMenorQueADeDoLeilao(),
                new LanceTotalDoUsuarioEhMenorQueCinco());
    }

    @Override
    public Boolean validar(Lance lance) {         
        validadores.forEach(v -> {
            if(!v.validar(lance))
                mensagensDeErro.add(v.showErrorMessage());
            });
        mensagensDeErro.forEach(System.out::println);
        return mensagensDeErro.isEmpty();
    }

Uma das implementações de validação:

public class LanceNaoPossuiDataMenorQueADeDoLeilao implements ValidarLance {

    @Override
    public Boolean validar(Lance lance) {        
        LocalDate dataAberturaLeilao = lance.getLeilao().getDataAbertura();
        if (!lance.getData().isBefore(dataAberturaLeilao)) {
            return Boolean.TRUE;
        }
        else {
            throw new IllegalArgumentException("Data do lance é menor que a Data de abertura do Leilao");            
        }
    }

teste do exemplo acima:

@Test
        void NaoDeveriaAceitarLanceComDataMenorQueADeAbertura() {
            Usuario usuario = geraNovoUsuario("joao");
            Usuario usuario2 = geraNovoUsuario("Claudio");

            Leilao leilao = geraLeilao(usuario, "50", LocalDate.now().plusDays(1));

            Lance lance = geraLance(usuario, leilao, "51");
            leilao.propoe(lance);

            Lance lance2 = geraLance(usuario2, leilao, "52");

            Exception e = Assert.assertThrows(IllegalArgumentException.class, () -> {
                leilao.propoe(lance2);
            });

            String mensagemDeErroEsperada = "Leilão está fechado e não está recebendo novas propostas!";

            assertTrue(e.getMessage().contains(mensagemDeErroEsperada));
        }
1 resposta

Olá Michel,

Pelo que entendi, você está com dúvidas sobre qual padrão de projeto utilizar na sua implementação e qual exceção usar em determinada situação.

Sobre o padrão de projeto, o Composite é utilizado para criar estruturas de objetos hierárquicos, onde objetos individuais e composições de objetos são tratados de maneira uniforme. Já o padrão que você utilizou parece ser o Chain of Responsibility, que permite que uma série de objetos possa tratar uma solicitação, passando-a adiante na cadeia até que um objeto possa lidar com ela.

Quanto à exceção a ser utilizada, a IllegalArgumentException é uma boa opção para o caso em que o lance é inválido, mas existem outras opções, como a IllegalStateException, por exemplo. A escolha da exceção depende do contexto e da situação em que ela será lançada.

Espero ter ajudado e bons estudos!