2012-04-09 10 views
7

En una prueba jUnit, quiero obtener algunas filas de la base de datos basadas en la columna name. Luego quiero probar que las filas que tengo tienen los nombres que esperaba. Tengo el siguiente:jUnit y Guava, comparando la igualdad de listas después de la transformación()

Set<MyClass> typesToGet = MyClassFactory.createInstances("furniture", 
    "audio equipment"); 
Collection<String> namesToGet = Collections2.transform(typesToGet, 
    new NameFunction<MyClass, String>()); 
List<MyClass> typesGotten = _svc.getAllByName(typesToGet); 
assertThat(typesGotten.size(), is(typesToGet.size())); 
Collection<String> namesGotten = Collections2.transform(typesGotten, 
    new NameFunction<ItemType, String>()); 
assertEquals(namesToGet, namesGotten); // fails here 

Actualmente me sale este error:

java.lang.AssertionError: expected: com.google.common.collect.Collections2$TransformedCollection<[audio equipment, furniture]> but was: com.google.common.collect.Collections2$TransformedCollection<[audio equipment, furniture]>

¿Cuál es la manera más limpia, más concisa para probar que llegué filas atrás de la base de datos cuyo name columna coincide con los nombres I dijo que yo quería? Podría tener un ciclo for iterando y comprobando que cada nombre en una lista existe en la otra, pero esperaba ser más conciso. Algo así como lo siguiente pseudocódigo sería bueno:

List<MyClass> typesGotten = ...; 
["furniture", "audio equipment"].equals(typesGotten.map(type => type.getName())) 

Respuesta

15

Usted puede utilizar containsAll() dos veces para comprobar que no tiene ningún valor faltante o cualquier valor inesperado.

assertTrue(namesToGet.containsAll(namesGotten)); 
assertTrue(namesGotten.containsAll(namesToGet)); 

Pero si usted decide utilizar List o Set en lugar de Collection, el contrato especifica que la interfaz de un List es igual a otro List (same for Set) iff both contains the same values.

Compares the specified object with this list for equality. Returns true if and only if the specified object is also a list, both lists have the same size, and all corresponding pairs of elements in the two lists are equal. (Two elements e1 and e2 are equal if (e1==null ? e2==null : e1.equals(e2)) .) In other words, two lists are defined to be equal if they contain the same elements in the same order. This definition ensures that the equals method works properly across different implementations of the List interface.


Recursos:

6

Si EXPE para que contengan los mismos elementos, pero no necesariamente en el mismo orden, haga una copia ImmutableSet de ambos y compruebe que esos conjuntos son iguales. Si espera que tengan el mismo pedido, haga copias de ImmutableList y compruebe que son iguales.

Collection realmente no tiene ningún concepto de igualdad en absoluto.

6

La manera más ordenada y más expresivo de la escritura tal afirmación es con un matcher Hamcrest:

assertThat(namesGotten, containsInAnyOrder(namesToGet)) 
+0

Creo que he encontrado 'containsInAnyOrder' describe en http://www.jarvana.com/jarvana/view/org/hamcrest/hamcrest-library/1.2.1/hamcrest-library-1.2.1-javadoc .jar! /org/hamcrest/Matchers.html pero no veo documentación al respecto. ¿Sabe si confirma que las dos colecciones tienen el mismo tamaño, que la colección 1 no tiene nada más que los elementos que se encuentran en la colección 2, y que la colección 2 no tiene más que elementos encontrados en la colección 1? –

+2

La documentación de Hamcrest es un poco escasa en esta área, por lo que vale la pena intentar algunos emparejamientos para convencerse de que están haciendo lo correcto. Alternativamente, el código fuente está en http://code.google.com/p/hamcrest/source/browse/trunk/hamcrest-java/hamcrest-library/src/main/java/org/hamcrest/collection/IsIterableContainingInAnyOrder.java ? r = 480. Sí, comprueba que la colección 1 tiene todos los elementos de la colección 2, y viceversa, y por lo tanto, que tienen el mismo tamaño. – Kkkev

3

guayaba tiene un método que me parece comunica bien el concepto que está tratando de conseguir: symmetricDifference. Si la diferencia simétrica está vacía, los conjuntos son iguales.

assetTrue(Sets.symmetricDifference(namesToGet, namesGotten).isEmpty()); 

Puede que no sea, sin embargo, el "más barato", ya que realiza una unión, intersección, y una operación de diferencia. También puede verificar si los conjuntos tienen el mismo tamaño; si no lo están, no contienen los mismos elementos, mientras que si lo están, puede verificar que el (0) asimétrico difference esté vacío.

assertEquals(namesToGet.size(), namesGotten.size()); 
assertTrue(Sets.difference(namesToGet, namesGotten)); 
Cuestiones relacionadas