¿Cómo afirmaría sucintamente la igualdad de Collection
elementos, específicamente a Set
en JUnit 4?
¿Cómo afirmaría sucintamente la igualdad de Collection
elementos, específicamente a Set
en JUnit 4?
Respuestas:
Puede afirmar que los dos Set
son iguales entre sí, lo que invoca el Set
equals()
método .
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 );
}
}
Esto @Test
pasará si los dos Set
s son del mismo tamaño y contienen los mismos elementos.
equals
e hashCode
implementado en la clase que está almacenando en su Hashtable?
Apache commons al rescate de nuevo.
assertTrue(CollectionUtils.isEqualCollection(coll1, coll2));
Funciona de maravilla. No sé por qué, pero descubrí que con las colecciones lo siguiente assertEquals(coll1, coll2)
no siempre funciona. En el caso de que me fallara, tenía dos colecciones respaldadas por Sets. Ni Hamcrest ni Junit dirían que las colecciones eran iguales, aunque yo estaba seguro de que lo eran. Usando CollectionUtils funciona perfectamente.
con hamcrest :
assertThat(s1, is(s2));
con simple aseverar:
assertEquals(s1, s2);
NB: t se utiliza el método equals () de la clase de conjunto de hormigón
Un caso particularmente interesante es cuando comparas
java.util.Arrays$ArrayList<[[name,value,type], [name1,value1,type1]]>
y
java.util.Collections$UnmodifiableCollection<[[name,value,type], [name1,value1,type1]]>
Hasta ahora, la única solución que veo es convertir ambos en conjuntos
assertEquals(new HashSet<CustomAttribute>(customAttributes), new HashSet<CustomAttribute>(result.getCustomAttributes()));
O podría compararlos elemento por elemento.
Como método adicional basado en matrices ... puede considerar el uso de aserciones de matrices desordenadas en junitx. Aunque el ejemplo de Apache CollectionUtils funcionará, también hay un paquete de extensiones sólidas de aserción:
Yo creo que el
ArrayAssert.assertEquivalenceArrays(new Integer[]{1,2,3}, new Integer[]{1,3,2});
El enfoque será mucho más legible y depurable para usted (todas las Colecciones admiten toArray (), por lo que debería ser bastante fácil usar los métodos ArrayAssert.
Por supuesto, la desventaja aquí es que, junitx es un archivo jar adicional o una entrada maven ...
<dependency org="junit-addons" name="junit-addons" rev="1.4"/>
Consulta este artículo . Un ejemplo de ahí:
@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);
}
Usando Hamcrest:
assertThat( set1, both(everyItem(isIn(set2))).and(containsInAnyOrder(set1)));
Esto también funciona cuando los conjuntos tienen diferentes tipos de datos e informa sobre la diferencia en lugar de simplemente fallar.
Si desea verificar si una Lista o Conjunto contiene un conjunto de valores específicos (en lugar de compararlo con una colección ya existente), a menudo el método toString de colecciones es útil:
String[] actualResult = calltestedmethod();
assertEquals("[foo, bar]", Arrays.asList(actualResult).toString());
List otherResult = callothertestedmethod();
assertEquals("[42, mice]", otherResult.toString());
Esto es un poco más corto que construir primero la colección esperada y compararla con la colección real, y más fácil de escribir y corregir.
(Es cierto que este no es un método particularmente limpio y no puede distinguir un elemento "foo, bar" de dos elementos "foo" y "bar". Pero en la práctica, creo que lo más importante es que sea fácil y rápido escribir pruebas , de lo contrario, muchos desarrolladores simplemente no lo harán sin ser presionados).
Me gusta la solución de Hans-Peter Störr ... Pero creo que no es del todo correcta. Lamentablemente containsInAnyOrder
, no acepta una Collection
de las objetcs para comparar. Entonces tiene que ser una Collection
de Matcher
las siguientes:
assertThat(set1, containsInAnyOrder(set2.stream().map(IsEqual::equalTo).collect(toList())))
Las importaciones son:
import static java.util.stream.Collectors.toList;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.junit.Assert.assertThat;