Come affermeresti succintamente l'uguaglianza degli Collection
elementi, in particolare a Set
in JUnit 4?
Come affermeresti succintamente l'uguaglianza degli Collection
elementi, in particolare a Set
in JUnit 4?
Risposte:
Puoi affermare che le due Set
s sono uguali tra loro, il che richiama il Set
equals()
metodo .
public class SimpleTest {
private Set<String> setA;
private Set<String> setB;
@Before
public void setUp() {
setA = new HashSet<String>();
setA.add("Testing...");
setB = new HashSet<String>();
setB.add("Testing...");
}
@Test
public void testEqualSets() {
assertEquals( setA, setB );
}
}
Questo @Test
passerà se i due Set
hanno la stessa dimensione e contengono gli stessi elementi.
equals
e hashCode
implementato nella classe che stai memorizzando nel tuo Hashtable?
Apache comunica di nuovo in soccorso.
assertTrue(CollectionUtils.isEqualCollection(coll1, coll2));
Funziona come un fascino. Non so perché, ma ho scoperto che con le collezioni assertEquals(coll1, coll2)
ciò che segue non sempre funziona. Nel caso in cui non fosse riuscito per me, avevo due raccolte supportate da Sets. Né hamcrest né junit direbbero che le collezioni erano uguali anche se sapevo per certo che lo erano. Utilizzando CollectionUtils funziona perfettamente.
con hamcrest :
assertThat(s1, is(s2));
con semplice affermazione:
assertEquals(s1, s2);
NB: t viene utilizzato il metodo equals () della classe concrete set
Un caso particolarmente interessante è quando si confronta
java.util.Arrays$ArrayList<[[name,value,type], [name1,value1,type1]]>
e
java.util.Collections$UnmodifiableCollection<[[name,value,type], [name1,value1,type1]]>
Finora, l'unica soluzione che vedo è cambiarli entrambi in set
assertEquals(new HashSet<CustomAttribute>(customAttributes), new HashSet<CustomAttribute>(result.getCustomAttributes()));
Oppure potrei confrontarli elemento per elemento.
Come metodo aggiuntivo basato su array ... puoi prendere in considerazione l'utilizzo di asserzioni di array non ordinate in junitx. Anche se l'esempio di Apache CollectionUtils funzionerà, c'è anche un pacchetto di solide estensioni di asserzioni:
Penso che il file
ArrayAssert.assertEquivalenceArrays(new Integer[]{1,2,3}, new Integer[]{1,3,2});
sarà molto più leggibile e debuggabile per te (tutte le raccolte supportano toArray (), quindi dovrebbe essere abbastanza facile usare i metodi ArrayAssert.
Ovviamente lo svantaggio qui è che junitx è un file jar aggiuntivo o una voce Maven ...
<dependency org="junit-addons" name="junit-addons" rev="1.4"/>
Controlla questo articolo . Un esempio da lì:
@Test
public void listEquality() {
List<Integer> expected = new ArrayList<Integer>();
expected.add(5);
List<Integer> actual = new ArrayList<Integer>();
actual.add(5);
assertEquals(expected, actual);
}
Utilizzando Hamcrest:
assertThat( set1, both(everyItem(isIn(set2))).and(containsInAnyOrder(set1)));
Questo funziona anche quando i set hanno diversi tipi di dati e segnala la differenza invece di fallire.
Se vuoi controllare se un elenco o un insieme contiene un insieme di valori specifici (invece di confrontarlo con una raccolta già esistente), spesso il metodo delle raccolte toString è utile:
String[] actualResult = calltestedmethod();
assertEquals("[foo, bar]", Arrays.asList(actualResult).toString());
List otherResult = callothertestedmethod();
assertEquals("[42, mice]", otherResult.toString());
Questo è un po 'più breve rispetto alla prima costruzione della raccolta prevista e al confronto con la raccolta effettiva, e più facile da scrivere e correggere.
(Certo, questo non è un metodo particolarmente pulito, e non può distinguere un elemento "foo, bar" da due elementi "foo" e "bar". Ma in pratica penso che sia più importante che sia facile e veloce scrivere test , altrimenti molti sviluppatori non lo faranno senza essere pressati.)
Mi piace la soluzione di Hans-Peter Störr ... Ma penso che non sia del tutto corretta. Purtroppo containsInAnyOrder
non accetta un Collection
di oggetti da confrontare. Quindi deve essere un Collection
di Matcher
s:
assertThat(set1, containsInAnyOrder(set2.stream().map(IsEqual::equalTo).collect(toList())))
Le importazioni sono:
import static java.util.stream.Collectors.toList;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.junit.Assert.assertThat;