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

System.NullReferenceException : Referência de objeto não definida para uma instância de um objeto

Instalei o NUnit via Nuget e está dando o erro ao executar o teste dentro do próprio Visual Studio 2017.

Na linha -> Assert.AreEqual( 3 , maiores.Count);

O que está faltando?

public void DeveEncontrarOsTresMaioresLances() { Usuario joao = new Usuario("João"); Usuario maria = new Usuario("Maria"); Leilao leilao = new Leilao("Playstation 3 Novo");

leilao.Propoe(new Lance(joao, 100.0)); leilao.Propoe(new Lance(maria, 200.0)); leilao.Propoe(new Lance(joao, 300.0)); leilao.Propoe(new Lance(maria, 400.0));

Avaliador leiloeiro = new Avaliador(); leiloeiro.Avalia(leilao);

List maiores = leiloeiro.TresMaiores;

Assert.AreEqual( 3 , maiores.Count); Assert.AreEqual(400, maiores[0].Valor, 0.00001); Assert.AreEqual(300, maiores[1].Valor, 0.00001); Assert.AreEqual(200, maiores[2].Valor, 0.00001); }

8 respostas

Boa noite Luiz, tudo bem?

O erro está na declaração da lista na seguinte linha:

List maiores = leiloeiro.TresMaiores;

O correto é:

List<Lance> maiores = leiloeiro.TresMaiores;

Bom dia, Wendel

Eu já tentei da forma que vc mencionou. E também deu o mesmo erro.

Eu tentei como descrito no vídeo: -> var maiores = leiloeiro.TresMaiores;

Está estranho. Deve faltar algum detalhe.

Bom dia Luiz,

Qual é o objeto que está nulo?

O erro direciona para esta linha:

Assert.AreEqual( 3 , maiores.Count);

Confere se na classe Avaliador esse método está implementado:

private void pegaOsMaioresNo(Leilao leilao)
{
    maiores = new List<Lance>(leilao.Lances.OrderByDescending(x => x.Valor));
    maiores = maiores.GetRange(0, 3);
}

Porque é ele quem atribui valor na propriedade TresMaiores.

Caso esteja implementado, coloca um break point na linha

var maiores = leiloeiro.TresMaiores;

E verifica se a propriedade está nula.

Está implementado dessa forma...

private void pegaOsMaioresNo(Leilao leilao) { maiores = new List(leilao.Lances.OrderByDescending(x => x.Valor)); maiores = maiores.GetRange(0, maiores.Count > 3 ? 3 : maiores.Count ); }

Eu coloquei um break e a variável maiores está como nula.

Em resumo o Avaliador está assim:

public class Avaliador { private double maiorDeTodos = Double.MinValue; private double menorDeTodos = Double.MaxValue; private List maiores;

...

private void pegaOsMaioresNo(Leilao leilao) { maiores = new List(leilao.Lances.OrderByDescending(x => x.Valor)); maiores = maiores.GetRange(0, maiores.Count > 3 ? 3 : maiores.Count ); }

public List TresMaiores { get { return this.maiores; } }

...

Será que não algum problema com esse "this.maiores"?

solução!

Consegui Wendel... Eu inclui dentro do método Avalia() "pegaOsMaioresNo(leilao);" . Dessa forma eu "forcei" a atualização da variável "maiores" (por isso retornava nula).

Ficou assim o Avalia():

public void Avalia(Leilao leilao) { foreach (var lance in leilao.Lances) { if (lance.Valor > maiorDeTodos) { maiorDeTodos = lance.Valor; } if (lance.Valor < menorDeTodos) { menorDeTodos = lance.Valor; } } pegaOsMaioresNo(leilao); }

Obrigado pela ajuda.

Boa Luiz!