Impossibile trovare assertArrayEquals(Object[] o1, Object[] o2).
Domanda
La mia configurazione:
Netbeans 6.7
Java6
JUnit 4.5 added as the Test libraries
Quando provo a passare due array di classi (cast come Object[]) ottengo l'errore "impossibile trovare il simbolo" e il mio test case non verrà compilato.
Non ho problemi con le altre dichiarazioni assert e, come ho detto, sto utilizzando le librerie JUnit 4.5.
Qualcuno ha idea di come risolvere questo problema o ha osservato questo comportamento bizzarro?
Netbeans è in grado di trovare questa dichiarazione di funzione tramite il completamento automatico, ma non è in grado di trovare dove si trova o di navigare fino ai sorgenti.
Codice d'esempio:
CustomObject[] coa = { new CustomObject() ....}
CustomObject[] expected = { new CustomObject() ... }
assertArrayEquals((Object[])coa, (Object[])expected);
Soluzione
Bene, Assert.assertArrayEquals è un metodo statico, come puoi vedere dal tuo codice che funziona:
org.junit.Assert.assertArrayEquals(....)
Ma nel codice che stavi fornendo, stavi cercando di usarlo come metodo di istanza:
assertArrayEquals((Object[])coa, (Object[])expected);
Funzionerebbe solo se avessi importato staticamente Assert.*
O Assert.assertArrayEquals
.
Ora, se le altre tue asserzioni funzionano, my Indovinare è quello da cui stai ancora derivando TestCase
(cioè.il "vecchio" modo di scrivere i test JUnit) e che le tue asserzioni stanno chiamando TestCase.assertEquals
eccetera.
Se potessi dare un breve ma completare esempio di test unitario in cui un'affermazione funziona ma assertArrayEquals
non lo fa, probabilmente potremmo capire cosa sta succedendo.
Altri suggerimenti
Non è necessario qualificare pienamente l'affermazione o lanciare gli array di opporsi array. Basta importare le parti appropriate di JUnit e passare gli array direttamente. Si dovrebbe invertire l'ordine dei parametri dal vostro esempio se - cosa vi aspettate viene prima ( "expecteds"), quello che effettivamente ottenere dal test arriva secondo ( "Erogato"). Questo funziona bene:
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 {}
}
Il problema era che il compilatore si rifiutava di esaminare la classe reale .. ma sarebbe con un percorso abosulte: org.junit.Assert.assertArrayEquals (....
piuttosto fastidioso posso aggiungere.
Mi piace la risposta di SingleShot tranne i suoi due array in realtà contengono gli stessi oggetti. E se gli oggetti non sono gli stessi oggetti reali (oggetti diversi, ma stessi valori devono essere uguali).
Così ho pensato di migliorare la sua risposta per mostrare come fare questo.
@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;
}
}