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
, Integer
e 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 Foo
classe in cui aggiungi elementi e dove puoi ottenerlo.
Un unit test Foo
che 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 List
come 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 String
ma 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"));
}
assertArrayEquals
giorno d'oggi. Utilizzare in combinazione conList#toArray
.