Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

TestaMediaDeZeroLance() ESTÁ APRESENTANDO Error

O primeiro teste rodou direitinho, mas o segundo com a média zero apresenta erro: java.util.NoSuchElementException: No Value present

package br.com.caelum.leilao.servico;

import br.com.caelum.leilao.dominio.Lance;
import br.com.caelum.leilao.dominio.Leilao;

public class Avaliador {

    private double maiorDeTodos = Double.NEGATIVE_INFINITY;
    private double menorDeTodos = Double.POSITIVE_INFINITY;
    private double media = 0;

    public void avalia(Leilao leilao) {
        for(Lance lance : leilao.getLances()) {
            if (lance.getValor() > this.maiorDeTodos) this.maiorDeTodos = lance.getValor();
            if (lance.getValor() < this.menorDeTodos) this.maiorDeTodos = lance.getValor();
        }

        this.media = leilao.getLances().stream().mapToDouble(l -> l.getValor()).average().getAsDouble();
    }


    public double getMaiorLance () { return this.maiorDeTodos; }

    public double getMenorLance() { return this.menorDeTodos; }

    public double getMedia() { return this.media; }

}
package br.com.caelum.leilao.teste;

import org.junit.Assert;
import org.junit.Test;

import br.com.caelum.leilao.dominio.Lance;
import br.com.caelum.leilao.dominio.Leilao;
import br.com.caelum.leilao.dominio.Usuario;
import br.com.caelum.leilao.servico.Avaliador;

public class AvaliadorTest {

    @Test
    public void deveCalcularMedia() {
        //cenario 3: lances em ordem crescente
        Leilao leilao = new Leilao("PlayStation 3");
        leilao.propoe(new Lance(new Usuario("Maria"), 300.0));
        leilao.propoe(new Lance(new Usuario("João"), 400.0));
        leilao.propoe(new Lance(new Usuario("Jose"), 500.0));

        //executando a ação
        Avaliador leiloeiro = new Avaliador();
        leiloeiro.avalia(leilao);

        //acompanhando a saida;
        double mediaEsperada = 400.0;

        Assert.assertEquals(mediaEsperada, leiloeiro.getMedia(), 0.00001);
    }


    @Test
    public void testaMediaDeZeroLance(){

        // cenario
        Usuario ewertom = new Usuario("Ewertom");

        // acao
        Leilao leilao = new Leilao("Iphone 7");

        Avaliador avaliador = new Avaliador();
        avaliador.avalia(leilao);

        //validacao
        Assert.assertEquals(0, avaliador.getMedia(), 0.0001);

    }
}
1 resposta
solução!

Criei um if com a condição se a lista estiver vazia, a média igual a 0 e funcionou.

package br.com.caelum.leilao.servico;

import br.com.caelum.leilao.dominio.Lance;
import br.com.caelum.leilao.dominio.Leilao;

public class Avaliador {

    private double maiorDeTodos = Double.NEGATIVE_INFINITY;
    private double menorDeTodos = Double.POSITIVE_INFINITY;
    private double media = 0;    

    public void avalia(Leilao leilao) {

        for(Lance lance : leilao.getLances()) {
            if(lance.getValor() > this.maiorDeTodos) this.maiorDeTodos = lance.getValor();
            if(lance.getValor() < this.menorDeTodos) this.menorDeTodos = lance.getValor();
        }
        if(leilao.getLances().isEmpty()) {
            this.media = 0;
            return;
        }
        this.media = leilao.getLances().stream().mapToDouble(l -> l.getValor()).average().getAsDouble();
    }

    public double getMaiorLance() { return this.maiorDeTodos; }
    public double getMenorLance() { return this.menorDeTodos; }
    public double getMedia() { return this.media; }
}

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