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