Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

Problemas nos testes do exercício 4 da aula 5.

No exercício 4 é proposto que

“Faça com que a classe Lance solte uma exceção IllegalArgumentException caso o valor do lance proposto seja menor ou igual a zero. Escreva o teste para essa funcionalidade, usando @Test(expected=...). Crie a classe LanceTest, caso necessário. Lembre-se das classes de equivalência. Escreva testes para: - O caso onde o valor do lance é 0; - O caso onde o valor do lance é negativo.”

Quando realizo os meus testes, a minha classe Lance encontra-se da seguinte forma:

package br.com.caelum.leilao.dominio;

public class Lance {

    private Usuario usuario;
    private double valor;

    public Lance(Usuario usuario, double valor) {
        if (usuario == null /*|| valor <= 0.00*/) {
            throw new IllegalArgumentException ("Preencha o nome do usuario e o valor do lance.");
        }
        this.usuario = usuario;
        this.valor = valor;
        }

    public Usuario getUsuario() {
        return usuario;
        }

    public double getValor() {
        return valor;
        }
    }

Nessa situação, quase todos os testes passam e dois testes acusam falha.

No entanto quando o trecho comentado é implementado, todos os testes acusam erro.

8 respostas

Olá, essa parte do código que está comentada lança uma exception se o valor passado for menor ou igual a 0.

Você precisa ver em seus testes se existe algum valor menor ou igual a 0 sendo passado, nesse caso, o teste irá falhar.

parece importante vc colocar os codigos dos testes.. pq se todos falham, quer dizer que em todos o valor ta zero ou o usuario ta nulo.

Vocẽ poderia postar aqui quais testes vocẽ está passando?

    package br.com.caelum.leilao.dominio;

    import org.junit.After;
    import org.junit.Assert;
    import org.junit.Before;
    import org.junit.Test;

    public class AvaliadorTest {

    private Usuario andre;
    private Usuario aline;
    private Usuario ricardo;
    private Usuario fred;
    private Avaliador leiloeiro;

    @Before
    public void setUp() {
    andre = new Usuario ("Andre");
    aline = new Usuario ("Aline");
    ricardo = new Usuario ("Ricardo");
    fred = new Usuario ("Fred");
    leiloeiro = new Avaliador ();

    }

    @Test
    public void main() {

        CriadorDeLeilao criadorDeLeilao = new CriadorDeLeilao();
        criadorDeLeilao.criaLeilao("XXX")
        .lance(fred, 3000.00)
        .lance(aline, 2500.00)
        .lance(ricardo, 3500.00)
        .lance(andre, 2000.00);

        leiloeiro.avalia(criadorDeLeilao.getLeilao());

        double maiorTest = 3500.00;
        double menorTest = 2000.00;
        double mediaTest = 11000.00/4;

        Assert.assertEquals (maiorTest, leiloeiro.maior.getValor(), 0.0001);
        Assert.assertEquals (menorTest, leiloeiro.menor.getValor(), 0.0001);
        Assert.assertEquals(mediaTest, leiloeiro.getMedia(), 0.0001 );
    }

    @Test
    public void main1() {

        CriadorDeLeilao criadorDeLeilao = new CriadorDeLeilao();
        criadorDeLeilao.criaLeilao("XXX")
        .lance(ricardo, 100.00);

        leiloeiro.avalia(criadorDeLeilao.getLeilao());

        Assert.assertEquals(leiloeiro.getMenor().getValor(), leiloeiro.getMaior().getValor(), 0.0001);
        Assert.assertEquals(leiloeiro.getMenor(), leiloeiro.getMaior());
    }

    @Test
    public void main2() {

        CriadorDeLeilao criadorDeLeilao = new CriadorDeLeilao();
        criadorDeLeilao.criaLeilao("XXX")
        .lance(ricardo, 200.00)
        .lance(aline, 450.00)
        .lance(fred, 120.00)
        .lance(andre, 700.00)
        .lance(ricardo, 530.00)
        .lance(andre, 630)
        .lance(aline, 230);

        double maiorTest = 700.00;
        double menorTest = 120.00;
        double mediaTest = 2860.00/7;

        leiloeiro.avalia(criadorDeLeilao.getLeilao());

        Assert.assertEquals (maiorTest, leiloeiro.maior.getValor(), 0.0001);
        Assert.assertEquals (menorTest, leiloeiro.menor.getValor(), 0.0001);
        Assert.assertEquals(mediaTest, leiloeiro.getMedia(), 0.0001 );
        }

    @Test
    public void main3() {

        CriadorDeLeilao criadorDeLeilao = new CriadorDeLeilao();
        criadorDeLeilao.criaLeilao("XXX")
        .lance(ricardo, 700.00)
        .lance(aline, 500.00)
        .lance(fred, 300.00)
        .lance(andre, 100.00);

        double maiorTest = 700.00;
        double menorTest = 100.00;
        double mediaTest = 1600.00/4;

        leiloeiro.avalia(criadorDeLeilao.getLeilao());

        Assert.assertEquals (maiorTest, leiloeiro.maior.getValor(), 0.0001);
        Assert.assertEquals (menorTest, leiloeiro.menor.getValor(), 0.0001);
        Assert.assertEquals(mediaTest, leiloeiro.getMedia(), 0.0001 );
        }

    @Test
    public void naoDeveAceitarDoisLancesSeguidosDoMesmoUsuario() {

        CriadorDeLeilao criadorDeLeilao = new CriadorDeLeilao();
        criadorDeLeilao.criaLeilao("XXX")
        .lance(fred, 2000.00)
        .lance(fred, 5000.00);

        int ultimo = criadorDeLeilao.getLeilao().getLances().size()-1;

        Assert.assertEquals(1, criadorDeLeilao.getLeilao().getLances().size());
        Assert.assertEquals(2000, criadorDeLeilao.getLeilao().getLances().get(ultimo).getValor(), 0.0001);

        }

    @Test
    public void naoDeveAceitarMaisDoQue5LancesDeUmMesmoUsuario() {

        CriadorDeLeilao criadorDeLeilao = new CriadorDeLeilao();
        criadorDeLeilao.criaLeilao("XXX")
        .lance(fred, 2000.00)
        .lance(aline, 3000.00)
        .lance(fred, 4000.00)
        .lance(aline, 6000.00)
        .lance(fred, 6500.00)
        .lance(aline, 7000.00)
        .lance(fred, 8500.00)
        .lance(aline, 9000.00)
        .lance(fred, 10000.00)
        .lance(aline, 12000)
        .lance(fred, 15000)
        .lance(aline, 16000);

        int ultimo = criadorDeLeilao.getLeilao().getLances().size()-1;

        Assert.assertEquals(10, criadorDeLeilao.getLeilao().getLances().size());
        Assert.assertEquals(12000, criadorDeLeilao.getLeilao().getLances().get(ultimo).getValor(), 0.00001);

        }

    @Test
    public void testeDobraLance () {

        CriadorDeLeilao criadorDeLeilao = new CriadorDeLeilao();
        criadorDeLeilao.criaLeilao("XXX")
        .lance(andre, 1000.00)
        .lance(aline, 2000.00)
        .lance(ricardo, 3000.00)
        .lance(fred, 4000.00)
        .lance(andre, 5000.00);

        Assert.assertEquals(10000, criadorDeLeilao.getLeilao().dobraLance(andre).getValor(), 0.0001);
        Assert.assertEquals(8000, criadorDeLeilao.getLeilao().dobraLance(fred).getValor(), 0.0001);

        }

    @Test (expected = RuntimeException.class) 
    public void testeLeiloeiroAvaliaLeilaoSemLances() {

    CriadorDeLeilao criadorDeLeilao = new CriadorDeLeilao();
    criadorDeLeilao.criaLeilao("XXX");

    leiloeiro.avalia(criadorDeLeilao.getLeilao());
        }

    @Test (expected = IllegalArgumentException.class) 
    public void testeComLanceIgualA0() {

    CriadorDeLeilao criadorDeLeilao = new CriadorDeLeilao();
    criadorDeLeilao.criaLeilao("XXX").lance(fred, 0);

        }

    @Test (expected = IllegalArgumentException.class) 
    public void testeComUsuarioNull() {

    CriadorDeLeilao criadorDeLeilao = new CriadorDeLeilao();
    criadorDeLeilao.criaLeilao("XXX").lance(null, 10);

        }

    @Test (expected = IllegalArgumentException.class) 
    public void testeComLanceMenorQue0() {

    CriadorDeLeilao criadorDeLeilao = new CriadorDeLeilao();
    criadorDeLeilao.criaLeilao("XXX").lance(fred, -1);
        }
    }

Na situação em que há testes passando, apenas o "testeComLanceMenorQue0" e o "testeComLanceIgualA0" falham. No caso dos testes acusarem erro, todos eles acusam erro.

PS: peço desculpas, não estou conseguindo deixar o código devidamente formatado.

O seu CriadorDeLeilao tem um método lance que usa o construtor da classe Lance, correto?

Assumindo isso, usando a classe da forma como está o método testeComLanceMenorQue0 não passa mesmo porque o não há resctrições sobre o valor que gerem a exception. E como o teste tem um expects exception, ele falha.

No outro método, testeComLanceIgualA0, o mesmo ocorre. Como o usuário é diferente de null, não há porque lançar a exception.

Você poderia postar o erro que aparece ao rodar os testes com a nova alteração? (usando o || valor <= 0.00)?

Na janela "Problems" não aparece erro nenhum. Na janela "Failure Trace" aparece: java.lang.IllegalArgumentException: Preencha o nome do usuario e o valor do lance.

at br.com.caelum.leilao.dominio.Lance.(Lance.java:10)

at br.com.caelum.leilao.dominio.Avaliador.(Avaliador.java:8)

at br.com.caelum.leilao.dominio.AvaliadorTest.setUp(AvaliadorTest.java:22)

solução!

Se vc seguir a stack trace veja que tudo começa dentro do seu metodo seTup da sua classe de teste ao dar new Avaliador() . Depois dessa etapa ele vai seguindo para outros pontos conforme descrito na stack. Agora tente entender o porque da exception seguindo cada ponto que a stack te informa. =)

Grato pela atenção. O problema foi sanado

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software