2013-09-05 7 views
5

Ho due mappe HashMap<Integer, Question> che vorrei confrontare. Question in questo caso è un Javabean che ho scritto.Come posso affermare che due HashMap con valori Javabean sono uguali?

Come si afferma che sia HashMap siano uguali? In questo scenario, uguale significa che entrambi HashMap contengono esattamente lo stesso bean Question?

Se è del tutto pertinente, sto scrivendo un test unitario utilizzando JUnit.

+1

Se si utilizza Java 1.7 o versione superiore, sotto frammento di codice funzionerà. '' 'Oggetti.uguale (previstoWordMap, actualWordMap) '' ' . . Per ulteriori informazioni sul metodo equals: https://docs.oracle.com/javase/8/docs/api/java/util/Objects.html#equals-java.lang.Object-java.lang.Object - –

risposta

6

Ecco la soluzione che alla fine ho utilizzato utilizzando che ha funzionato perfettamente per i test unitari.

for(Map.Entry<Integer, Question> entry : questionMap.entrySet()) { 
    assertReflectionEquals(entry.getValue(), expectedQuestionMap.get(entry.getKey()), ReflectionComparatorMode.LENIENT_ORDER); 
} 

Questo comporta invocando assertReflectionEquals() dal pacchetto unitils.

<dependency> 
    <groupId>org.unitils</groupId> 
    <artifactId>unitils-core</artifactId> 
    <version>3.3</version> 
    <scope>test</scope> 
</dependency> 
0

Se la classe Domanda implementa equals allora si può solo fare

assertEquals(expectedMap, hashMap); 

assertTrue(expectedMap.equals(hashMap)); 

L'interfaccia Map specifica che due mappe sono uguali se contengono elementi uguali per le chiavi uguali.

0

se la classe fagiolo ha un campo che sarà unico per ogni oggetto creato allora si dovrebbe sovrascrivere equals e metodo di codice hash in ur classe bean con quel campo

2

Troppo confrontare le mappe, nel tuo caso particolare:

1) Controllare la dimensione della mappa se uguale

Quindi utilizzare

`assertTrue(expectedMap.equals(hashMap));` 

In bean domanda è necessario eseguire l'override il metodo equals e hashcode.

1

Ecco come HashMap uguale metodo funziona:

public boolean equals(Object o) { 
.......... 
.......... 
Map<K,V> m = (Map<K,V>) o; 
.......... 
    Iterator<Entry<K,V>> i = entrySet().iterator(); 
    while (i.hasNext()) { 
    Entry<K,V> e = i.next(); 
      K key = e.getKey(); 
      V value = e.getValue(); 
      if (value == null) { 
       if (!(m.get(key)==null && m.containsKey(key))) 
        return false; 
      } else { 
       if (!value.equals(m.get(key))) 
        return false; 
      } 
........... 
........... 
return true; 
} 

Ora, poiché, si invoca il metodo equals di oggetti di valore, questo significa che gli oggetti di valore per una data chiave dovrebbero essere lo stesso (come governata da pari metodo) .

Sopra ti aiuterà a capire in quale caso passeranno i tuoi JUnit. Nel suo metodo di JUnit è possibile utilizzare:

public static void assertEquals(java.lang.Object expected, 
           java.lang.Object actual) 

Vedere link per maggiori dettagli.

Saluti !!

0

È possibile utilizzare compare(-,-) (utilizzato principalmente per lo scopo sorting) dell'interfaccia Comparator per implementare il confronto personalizzato tra gli oggetti come requisito. Oppure utilizzare il metodo equals() per confrontare gli oggetti.

5

Usando Guava si può fare:

assertTrue(Maps.difference(expected, actual).areEqual());