Pergunta

Minha configuração:

  Netbeans 6.7
  Java6
  JUnit 4.5 added as the Test libraries

Quando tento passar em duas matrizes de classe (fundido como objeto []), recebo o erro "Não consigo encontrar o símbolo" e meu caso de teste não será compilado.

Não tenho um problema com as outras declarações de assert e, como disse, estou usando as bibliotecas Junit 4.5.

Alguém tem uma idéia de como consertar isso ou observou esse comportamento peculiar?

O NetBeans é capaz de encontrar essa declaração de função através de seu preenchimento automático, mas é incapaz de encontrar onde está localizado ou pode navegar até as fontes.

Código de amostra:

CustomObject[] coa = { new CustomObject() ....}
CustomObject[] expected = { new CustomObject() ... } 
assertArrayEquals((Object[])coa, (Object[])expected);
Foi útil?

Solução

Bem, Assert.AsserTrayequals é um método estático, como você pode ver no seu código que está funcionando:

 org.junit.Assert.assertArrayEquals(....)

Mas no código que você estava dando, você estava tentando usá -lo como um método de instância:

 assertArrayEquals((Object[])coa, (Object[])expected);

Isso só funcionaria se você importasse estaticamente Assert.* ou Assert.assertArrayEquals.

Agora, se suas outras afirmações estão funcionando, meu acho É isso que você ainda está derivando de TestCase (ou seja, a maneira "antiga" de escrever testes Junit) e que suas afirmações estão ligando TestCase.assertEquals etc.

Se você pudesse dar um pouco, mas completo Exemplo de um teste de unidade em que uma afirmação funciona, mas assertArrayEquals Provavelmente não, poderíamos descobrir o que está acontecendo.

Outras dicas

Você não precisa qualificar completamente a afirmação ou lançar suas matrizes para matrizes de objetos. Basta importar as partes adequadas do JUNIT e passar diretamente em suas matrizes. Você deve reverter a ordem dos parâmetros do seu exemplo - o que você espera vem primeiro ("esperados"), o que você realmente recebe do teste é o segundo ("reais"). Isso funciona bem:

import org.junit.*;
import static org.junit.Assert.*;

public class TestJUnitActuallyWorks {

    @Test
    public void myArraysShouldBeIdentical() {

        CustomObject one = new CustomObject();
        CustomObject two = new CustomObject();
        CustomObject three = new CustomObject();

        CustomObject[] expecteds = { one, two, three };
        CustomObject[] actuals = { one, two, three };
        assertArrayEquals(expecteds, actuals);
    }

    private static class CustomObject {}
}

A questão era que o compilador estava se recusando a investigar a classe real. Mas seria com um caminho de abosulte: org.junit.assert.assertArrayequals (....

Bastante irritante, posso acrescentar.

Eu gosto da resposta de Singleshot, exceto que suas duas matrizes realmente contêm os mesmos objetos. E se os objetos não forem os mesmos objetos reais (objetos diferentes dos mesmos valores, mas devem ser iguais).

Então, pensei em melhorar sua resposta para mostrar como fazer isso.

@Test
public void myArraysShouldBeIdentical() {

    CustomObject one1 = new CustomObject("one");
    CustomObject two1 = new CustomObject("two");
    CustomObject three1 = new CustomObject("three");

    CustomObject one2 = new CustomObject("one");
    CustomObject two2 = new CustomObject("two");
    CustomObject three2 = new CustomObject("three");

    CustomObject[] expecteds = { one1, two1, three1 };
    CustomObject[] actuals = { one2, two2, three2 };
    assertArrayEquals(expecteds, actuals);
}

private static class CustomObject {
    public String value;

    CustomObject(String inValue)
    {
        value = inValue;
    }

    @Override
    public int hashCode() {
        return value.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null)
            return false;
        if (obj == this)
            return true;
        if (!(obj instanceof CustomObject))
            return false;

        CustomObject rhs = (CustomObject) obj;
        return value == rhs.value;
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top