CollectionAssert in jUnit?


Risposte:


126

Usando JUnit 4.4 puoi usare assertThat()insieme al codice Hamcrest (non preoccuparti, viene fornito con JUnit, non c'è bisogno di un extra .jar) per produrre asserzioni auto-descrittive complesse, comprese quelle che operano sulle collezioni:

import static org.junit.Assert.assertThat;
import static org.junit.matchers.JUnitMatchers.*;
import static org.hamcrest.CoreMatchers.*;

List<String> l = Arrays.asList("foo", "bar");
assertThat(l, hasItems("foo", "bar"));
assertThat(l, not(hasItem((String) null)));
assertThat(l, not(hasItems("bar", "quux")));
// check if two objects are equal with assertThat()

// the following three lines of code check the same thing.
// the first one is the "traditional" approach,
// the second one is the succinct version and the third one the verbose one 
assertEquals(l, Arrays.asList("foo", "bar")));
assertThat(l, is(Arrays.asList("foo", "bar")));
assertThat(l, is(equalTo(Arrays.asList("foo", "bar"))));

Usando questo approccio otterrai automaticamente una buona descrizione dell'asserzione quando fallisce.


1
Ooh, non mi ero reso conto che Hamcrest fosse entrato nella junit distro. Go Nat!
skaffman

Se voglio affermare che l è composto da elementi ("foo", "bar"), ma non esistono altri elementi - esiste una sintassi semplice per questo?
ripper234

Usa lo snippet di codice sopra e inserisci un ulteriore assertTrue (l.size () == 2)
aberrant80

4
Meh, brutto. In NUnit è CollectionAssert.AreEqual (raccolta prevista, raccolta effettiva);
ripper234

1
Google ha trovato un'altra risposta Stackoverflow che stavo cercando!
Mykola Golubyev

4

Non direttamente, no. Suggerisco l'uso di Hamcrest , che fornisce un ricco set di regole di corrispondenza che si integra perfettamente con jUnit (e altri framework di test)


Questo non si compila per qualche motivo (vedi stackoverflow.com/questions/1092981/hamcrests-hasitems ): ArrayList <Integer> actual = new ArrayList <Integer> (); ArrayList <Integer> atteso = nuovo ArrayList <Integer> (); effettivo.add (1); previsto.add (2); assertThat (effettivo, hasItems (atteso));
ripper234


2

La soluzione di Joachim Sauer è carina ma non funziona se hai già una serie di aspettative che vuoi verificare siano nel tuo risultato. Questo potrebbe accadere quando hai già un'aspettativa generata o costante nei tuoi test con cui vuoi confrontare un risultato, o forse hai più aspettative che ti aspetti di essere unite nel risultato. Quindi, invece di usare i matcher puoi semplicemente usare List::containsAlle assertTrueFor Example:

@Test
public void testMerge() {
    final List<String> expected1 = ImmutableList.of("a", "b", "c");
    final List<String> expected2 = ImmutableList.of("x", "y", "z");
    final List<String> result = someMethodToTest(); 

    assertThat(result, hasItems(expected1)); // COMPILE ERROR; DOES NOT WORK
    assertThat(result, hasItems(expected2)); // COMPILE ERROR; DOES NOT WORK

    assertTrue(result.containsAll(expected1));  // works~ but has less fancy
    assertTrue(result.containsAll(expected2));  // works~ but has less fancy
}

Puoi sempre usare hasItems(expected1.toArray(new String[expected1.size()])). Ti darà messaggi di errore migliori.
meustrus
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.