I can not do a unit test

-3

I have a problem with doing a test method in this JAVA program. The method I created was to check if the wolf is dead.

@Test
public void verificaSeOLoboMorreAposCompletarAIdade(){
    campo = new Campo(4,4);
    localizacao = new Localizacao(0,0);
    ArrayList<LoboGuara> novosLobos = new ArrayList<>();
    loboGuara = new LoboGuara(false,campo,localizacao);
    for (int i = 0; i >= 7; i++){
        loboGuara.caca(novosLobos);
    }
    Assert.assertTrue(campo.pegarAnimalNaPosicao(0,0) == null);
}

The methods are private, along with their attributes. (I can not change them)

    private static final int IDADE_PROCRIACAO = 10;
    private static final int IDADE_MAXIMA = 150;
    private static final double PROBABILIDADE_PROCRIACAO = 0.75;
    private static final int TAMANHO_MAXIMO_NINHADA = 5;
    private static final int VALOR_FOME_OVELHA = 7;
    private static final Random rand = Randomizador.getRandom();

    private int idade;
    private boolean vivo;
    private Localizacao localizacao;
    private Campo campo;
    private int nivelFome;

    public LoboGuara(boolean idadeRandomica, Campo campo, Localizacao localizacao)
    {
        idade = 0;
        vivo = true;
        this.campo = campo;
        setLocalizacao(localizacao);
        if(idadeRandomica) {
            idade = rand.nextInt(IDADE_MAXIMA);
            nivelFome = rand.nextInt(VALOR_FOME_OVELHA);
        }
        else {
            nivelFome = VALOR_FOME_OVELHA;
        }
    }

    public void caca(List<LoboGuara> novosLobos)
    {
        this.incrementaIdade();
        this.incrementaFome();
        if(vivo) {
            daALuz(novosLobos);
            Localizacao newLocalizacao = procuraComida(localizacao);
            if(newLocalizacao == null) { 
                newLocalizacao = campo.localizacaoAdjacenteLivre(localizacao);
            }
            if(newLocalizacao != null) {
                setLocalizacao(newLocalizacao);
            }
            else {
                setMorte();
            }
        }
    }

    public boolean estaVivo()
    {
        return vivo;
    }

    public Localizacao getLocalizacao()
    {
        return localizacao;
    }

    private void setLocalizacao(Localizacao newLocalizacao)
    {
        if(localizacao != null) {
            campo.limpa(localizacao);
        }
        localizacao = newLocalizacao;
        try {
            campo.lugar(this, newLocalizacao);
        } catch (ObjetoInvalidoException e) {
            e.printStackTrace();
        }
    }

    private void incrementaIdade()
    {
        idade++;
        if(idade >= IDADE_MAXIMA) {
            setMorte();
        }
    }

    private void incrementaFome()
    {
        nivelFome--;
        if(nivelFome == 0) {
            setMorte();
        }
    }

    private Localizacao procuraComida(Localizacao localizacao)
    {
        List<Localizacao> adjacente = campo.localizacoesAdjacentes(localizacao);
        Iterator<Localizacao> it = adjacente.iterator();
        while(it.hasNext()) {
            Localizacao onde = it.next();
            Object animal = campo.pegarAnimalNaPosicao(onde);
            if (animal instanceof Ovelha) {
                Ovelha ovelha = (Ovelha) animal;
                ovelha.setMorte();
                nivelFome = VALOR_FOME_OVELHA;
                return onde;
            }
        }
        return null;
    }

    private void daALuz(List<LoboGuara> novosLobos)
    {
        List<Localizacao> livre = campo.localizacoesAdjacentesLivres(localizacao);
        int nascimentos = procria();
        for(int b = 0; b < nascimentos; b++) {
            if (livre.size() > 0) {
                Localizacao loc = livre.remove(0);
                LoboGuara jovem = new LoboGuara(false, campo, loc);
                novosLobos.add(jovem);
            }
        }
    }

    private int procria()
    {
        int nascimentos = 0;
        if(podeProcriar() && rand.nextDouble() < PROBABILIDADE_PROCRIACAO) {
            nascimentos = rand.nextInt(TAMANHO_MAXIMO_NINHADA) + 1;
        }
        return nascimentos;
    }

    private boolean podeProcriar()
    {
        return idade > IDADE_PROCRIACAO;
    }

    private void setMorte()
    {
        vivo = false;
        if(localizacao != null) {
            campo.limpa(localizacao);
            localizacao = null;
            campo = null;
        }
    }
}

If someone can give a light, I thank you!

    
asked by anonymous 24.08.2017 / 21:19

1 answer

0

Well, first you have not posted your complete code. import , LoboGuara , Localizacao , Campo , Animal , Ovelha , ObjetoInvalidoException , and Randomizador were missing. I put the simplest possible implementation of them and it looks like this:

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Random;

class Animal {}

class Campo {

    public Campo(int x, int y) {}

    public void limpa(Localizacao x) {
    }

    public Localizacao localizacaoAdjacenteLivre(Localizacao x) {
        return x;
    }

    public void lugar(LoboGuara x, Localizacao y) throws ObjetoInvalidoException {
    }

    public List<Localizacao> localizacoesAdjacentes(Localizacao x) {
        return Arrays.asList();
    }

    public List<Localizacao> localizacoesAdjacentesLivres(Localizacao x) {
        return Arrays.asList();
    }

    public Animal pegarAnimalNaPosicao(Localizacao x) {
        return null;
    }

    public Animal pegarAnimalNaPosicao(int x, int y) {
        return null;
    }
}

class ObjetoInvalidoException extends Exception {}

class Localizacao {
    public Localizacao(int x, int y) {}
}

class Randomizador {
    public static Random getRandom() {
        return new Random();
    }
}

class Ovelha extends Animal {
    public void setMorte() {}
}

public class LoboGuara extends Animal {
    private static final int IDADE_PROCRIACAO = 10;
    private static final int IDADE_MAXIMA = 150;
    private static final double PROBABILIDADE_PROCRIACAO = 0.75;
    private static final int TAMANHO_MAXIMO_NINHADA = 5;
    private static final int VALOR_FOME_OVELHA = 7;
    private static final Random rand = Randomizador.getRandom();

    private int idade;
    private boolean vivo;
    private Localizacao localizacao;
    private Campo campo;
    private int nivelFome;

    public LoboGuara(boolean idadeRandomica, Campo campo, Localizacao localizacao)
    {
        idade = 0;
        vivo = true;
        this.campo = campo;
        setLocalizacao(localizacao);
        if(idadeRandomica) {
            idade = rand.nextInt(IDADE_MAXIMA);
            nivelFome = rand.nextInt(VALOR_FOME_OVELHA);
        }
        else {
            nivelFome = VALOR_FOME_OVELHA;
        }
    }

    public void caca(List<LoboGuara> novosLobos)
    {
        this.incrementaIdade();
        this.incrementaFome();
        if(vivo) {
            daALuz(novosLobos);
            Localizacao newLocalizacao = procuraComida(localizacao);
            if(newLocalizacao == null) { 
                newLocalizacao = campo.localizacaoAdjacenteLivre(localizacao);
            }
            if(newLocalizacao != null) {
                setLocalizacao(newLocalizacao);
            }
            else {
                setMorte();
            }
        }
    }

    public boolean estaVivo()
    {
        return vivo;
    }

    public Localizacao getLocalizacao()
    {
        return localizacao;
    }

    private void setLocalizacao(Localizacao newLocalizacao)
    {
        if(localizacao != null) {
            campo.limpa(localizacao);
        }
        localizacao = newLocalizacao;
        try {
            campo.lugar(this, newLocalizacao);
        } catch (ObjetoInvalidoException e) {
            e.printStackTrace();
        }
    }

    private void incrementaIdade()
    {
        idade++;
        if(idade >= IDADE_MAXIMA) {
            setMorte();
        }
    }

    private void incrementaFome()
    {
        nivelFome--;
        if(nivelFome == 0) {
            setMorte();
        }
    }

    private Localizacao procuraComida(Localizacao localizacao)
    {
        List<Localizacao> adjacente = campo.localizacoesAdjacentes(localizacao);
        Iterator<Localizacao> it = adjacente.iterator();
        while(it.hasNext()) {
            Localizacao onde = it.next();
            Object animal = campo.pegarAnimalNaPosicao(onde);
            if (animal instanceof Ovelha) {
                Ovelha ovelha = (Ovelha) animal;
                ovelha.setMorte();
                nivelFome = VALOR_FOME_OVELHA;
                return onde;
            }
        }
        return null;
    }

    private void daALuz(List<LoboGuara> novosLobos)
    {
        List<Localizacao> livre = campo.localizacoesAdjacentesLivres(localizacao);
        int nascimentos = procria();
        for(int b = 0; b < nascimentos; b++) {
            if (livre.size() > 0) {
                Localizacao loc = livre.remove(0);
                LoboGuara jovem = new LoboGuara(false, campo, loc);
                novosLobos.add(jovem);
            }
        }
    }

    private int procria()
    {
        int nascimentos = 0;
        if(podeProcriar() && rand.nextDouble() < PROBABILIDADE_PROCRIACAO) {
            nascimentos = rand.nextInt(TAMANHO_MAXIMO_NINHADA) + 1;
        }
        return nascimentos;
    }

    private boolean podeProcriar()
    {
        return idade > IDADE_PROCRIACAO;
    }

    private void setMorte()
    {
        vivo = false;
        if(localizacao != null) {
            campo.limpa(localizacao);
            localizacao = null;
            campo = null;
        }
    }
}

Now let's go to the test:

  • First, you used the wrong stop condition in for . It was meant to be x < 7 and not x >= 7 .

  • Second, you have not verified that the wolf is alive!

With these settings your test should look like this:

@Test
public void verificaSeOLoboMorreAposCompletarAIdade() {
    Campo campo = new Campo(4, 4);
    Localizacao localizacao = new Localizacao(0, 0);
    ArrayList<LoboGuara> novosLobos = new ArrayList<>();
    LoboGuara loboGuara = new LoboGuara(false, campo, localizacao);
    for (int i = 0; i < 7; i++) {
        loboGuara.caca(novosLobos);
    }
    Assert.assertFalse(loboGuara.estaVivo());
    Assert.assertNull(campo.pegarAnimalNaPosicao(0, 0));
}

The test works. However, since I had to provide pretty silly implementations for several of the classes, it might not be that simple in your case. Another possible test of the isVivo() method would be this:

@Test
public void verificaSeOLoboNaoMorreAntesDeCompletarAIdade() {
    Campo campo = new Campo(4, 4);
    Localizacao localizacao = new Localizacao(0, 0);
    ArrayList<LoboGuara> novosLobos = new ArrayList<>();
    LoboGuara loboGuara = new LoboGuara(false, campo, localizacao);
    for (int i = 0; i < 6; i++) {
        loboGuara.caca(novosLobos);
    }
    Assert.assertTrue(loboGuara.estaVivo());
    Assert.assertNotNull(campo.pegarAnimalNaPosicao(0, 0));
}

Already a test for getLocalizacao() :

@Test
public void verificaSeOLoboFicaOndeFoiColocado() {
    Campo campo = new Campo(4, 4);
    Localizacao localizacao = new Localizacao(2, 3);
    ArrayList<LoboGuara> novosLobos = new ArrayList<>();
    LoboGuara loboGuara = new LoboGuara(false, campo, localizacao);
    Assert.assertEquals(localizacao, loboGuara.getLocalizao());
}

It is not a good idea to put Campo and Localizacao as attributes of the test class in this case because it is the test itself that creates and uses them. If they were created in the constructor or in a method annotated with @Before or @BeforeClass , then that would be the case. A more advanced alternative would be to work with @Rule .

    
24.08.2017 / 23:28