assertEquals(Object, Object)da JUnit4 / JUnit 5 o assertThat(actual, is(expected));da Hamcrest proposti nelle altre risposte funzioneranno solo come entrambi equals()e toString()saranno sovrascritti per le classi (e profondamente) degli oggetti confrontati.
È importante perché il test di uguaglianza nell'asserzione si basa equals()e il messaggio di fallimento del test si basa sugli toString()oggetti confrontati.
Per classi integrate come String, Integere quindi per ... nessun problema in quanto queste hanno la precedenza su entrambe equals()e toString(). Quindi è perfettamente valido per affermare List<String>o List<Integer>con assertEquals(Object,Object).
E su questo argomento: devi scavalcare equals()una classe perché ha senso in termini di uguaglianza degli oggetti, non solo per semplificare le asserzioni in un test con JUnit.
Per facilitare le asserzioni hai altri modi.
Come buona pratica preferisco le librerie di asserzioni / matcher.
Ecco una soluzione AssertJ .
org.assertj.core.api.ListAssert.containsExactly() è ciò di cui hai bisogno: verifica che il gruppo effettivo contenga esattamente i valori indicati e nient'altro, nell'ordine indicato in javadoc.
Supponi una Fooclasse in cui aggiungi elementi e dove puoi ottenerlo.
Un unit test Fooche afferma che i due elenchi hanno lo stesso contenuto potrebbe apparire come:
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
@Test
void add() throws Exception {
Foo foo = new Foo();
foo.add("One", "Two", "Three");
Assertions.assertThat(foo.getElements())
.containsExactly("One", "Two", "Three");
}
Un punto positivo di AssertJ è che dichiarare un Listcome previsto è inutile: rende l'asserzione più chiara e il codice più leggibile:
Assertions.assertThat(foo.getElements())
.containsExactly("One", "Two", "Three");
Ma le librerie Assertion / matcher sono un must perché queste lo faranno davvero oltre.
Supponiamo ora che Foo non memorizzi le istanze di Stringma Bar.
Questo è un bisogno molto comune. Con AssertJ l'affermazione è ancora semplice da scrivere. Meglio affermare che il contenuto dell'elenco è uguale anche se la classe degli elementi non ha priorità equals()/hashCode()mentre JUnit richiede che:
import org.assertj.core.api.Assertions;
import static org.assertj.core.groups.Tuple.tuple;
import org.junit.jupiter.api.Test;
@Test
void add() throws Exception {
Foo foo = new Foo();
foo.add(new Bar(1, "One"), new Bar(2, "Two"), new Bar(3, "Three"));
Assertions.assertThat(foo.getElements())
.extracting(Bar::getId, Bar::getName)
.containsExactly(tuple(1, "One"),
tuple(2, "Two"),
tuple(3, "Three"));
}
assertArrayEqualsgiorno d'oggi. Utilizzare in combinazione conList#toArray.