I’m not getting a unit test

Asked

Viewed 745 times

-3

I have a problem to do a test method in this JAVA program. The method I devised was to verify that 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 cannot 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 anyone can shed some light!

  • Post the source code itself in no images. This makes it easy for those who answer.

  • 3

    Please read this : https://pt.meta.stackoverflow.com/questions/5483/manual-de-como-n%C3%83o-ask-questions

  • The chances of someone trying to help you with the codes in images are very low, just as @Zulian quoted, post the code instead of images

  • 1

    Now, yes. Thank you for your help!

  • Missed the public class LoboGuara and the Imports. The class LoboGuara has some structural problems, but if you can’t change it, keep it quiet. However, it’s not clear what you want to test exactly. You want to test only if the maned wolf dies or you want to test the behavior of all public methods?

  • @Victorstafusa Thanks for the answer! I’m wanting to test all the public methods. I want to test if the lobeGuara dies, after reaching the level of hunger.

Show 1 more comment

1 answer

0


Well, first you didn’t post your full code. Missed the imports, the class declaration LoboGuara and the classes Localizacao, Campo, Animal, Ovelha, ObjetoInvalidoException and Randomizador. I put the simplest possible implementation of them and it was 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 on for. Was to be x < 7 and not x >= 7.

  • Second, you haven’t checked if the wolf is alive!

With these adjustments your test should stay 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 is working. However, since I had to provide pretty silly implementations for several of the classes, it may not be that simple in your case. Another possible method test isVivo() would that be:

@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 the 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’s 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 yes it would be the case. A more advanced alternative would be to work with @Rule.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.