¿Cómo afirmaría sucintamente la igualdad de los elementos collections
, específicamente un Set
en JUnit 4
?JUnit 4 comparar Colecciones
Respuesta
Usted puede simplemente afirmar que los dos conjuntos son iguales entre sí, que invoca el Conjunto equals() method.
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);
}
}
Esta prueba pasará si los dos conjuntos son del mismo tamaño y contienen los mismos elementos.
También funciona para Map. –
Esto no muestra muy buenos resultados en el informe. Si su toStrings está claramente definido, es mejor, pero aún así no es bueno (una pequeña diferencia puede terminar en una página de texto) –
Uhm, cómo es que obtengo: java.lang.AssertionError: expected: java.util.Hashtable <{ NombreCompañía = 8PKQ9va3nW8pRWb4SjPF2DvdQDBmlZ, Ric = sZwmXAdYKv, Categoría = AvrIfd, QuoteID = 4342740204922826921}> pero era: java.util.Hashtable <{CompanyName = 8PKQ9va3nW8pRWb4SjPF2DvdQDBmlZ, Ric = sZwmXAdYKv, Categoría = AvrIfd, QuoteID = 4342740204922826921}> –
con hamcrest:
assertThat(s1, is(s2));
con afirmar claro:
assertEquals(s1, s2);
NB: t los iguales() de la clase conjunto concreto se utiliza
Prefiero este método ya que Hamcrest viene con JUnit 4 por lo que no hay necesidad de otras bibliotecas. – JRSofty
Esto puede no funcionar cuando los conjuntos tienen diferentes tipos. –
Comprobar this article. Un ejemplo de allí:
@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);
}
Un caso particularmente interesante es cuando se compara
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 cambiar tanto de ellos en conjuntos
assertEquals(new HashSet<CustomAttribute>(customAttributes), new HashSet<CustomAttribute>(result.getCustomAttributes()));
O podría compararlos elemento por elemento.
En realidad, hay varias soluciones para las que se presentan en las otras respuestas. Los conjuntos son un poco desafortunados para esto, de todos modos, ya que ignoran el orden. Quizás ArrayList? –
Apache comunes para el rescate de nuevo.
assertTrue(CollectionUtils.isEqualCollection(coll1, coll2));
Funciona como un encanto. No sé por qué pero encontré que con las colecciones, el siguiente assertEquals(coll1, coll2)
no siempre funciona. En el caso de que fallara, tenía dos colecciones respaldadas por Sets. Ni Hamcrest ni Junit dirían que las colecciones eran iguales, aunque sabía con certeza que lo eran. Usando CollectionUtils funciona perfectamente.
Esto es realmente trivial, la parte difícil es indicar claramente la diferencia a la persona que llama –
La respuesta aceptada es una buena respuesta para la pregunta original (prueba unitaria específicamente para dos conjuntos) pero esta respuesta con CollectionUtils es una mejor respuesta para el caso más general. No pude comparar una Colección y un Conjunto a menos que use CollectionUtils. – Jay
Como método adicional basado en matrices ... puede considerar el uso de aserciones de matrices no ordenadas en junitx. Aunque el ejemplo Apache CollectionUtils va a funcionar, hay un thepacakge de extensiones afirmación sólidas allí también:
creo que el enfoque
ArrayAssert.assertEquivalenceArrays(new Integer[]{1,2,3}, new Integer[]{1,3,2});
será mucho más fácil de leer y depurable para usted (Todas las colecciones apoyan toArray(), por lo tanto, debería ser bastante fácil utilizar los métodos ArrayAssert.
Por supuesto, la desventaja aquí es que junitx es un archivo jar adicional o una entrada de experto ...
<dependency org="junit-addons" name="junit-addons" rev="1.4"/>
Si desea comprobar si una lista o grupo se compone de un conjunto de valores específicos (en lugar de compararlo con una colección ya existente), a menudo el método toString de las 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 se puede distinguir un elemento "foo, bar" de dos elementos "foo" y "bar". Pero en la práctica creo que es más importante que sea fácil y rápido para escribir pruebas, de lo contrario muchos desarrolladores simplemente no van sin ser presionado)
Esto hace que el resultado de su prueba de unidad dependa de la implementación de toString de la lista. Si deciden cambiar el formato, la prueba unitaria ya no funcionará. No lo consideraría seguro. –
@ LaurensOp'tZandt ¿Quiere decir que Oracle está cambiando el formato de Collection.toList()? Eso ciertamente no va a suceder. Sin embargo, tienes razón, eso no es particularmente limpio. Pero en la práctica, tengo la impresión de que es muy importante que sea muy fácil escribir pruebas. –
Estoy de acuerdo, creo que el método toString no es probable. Entonces probablemente continuará funcionando. Solo quería señalar que no es una forma muy limpia. Pero de hecho es muy fácil. Un problema que surge es cuando se comparan conjuntos. Dado que su orden no está garantizada –
Usando Hamcrest:.
assertThat(set1, both(everyItem(isIn(set2))).and(containsInAnyOrder(set1)));
Esto funciona también cuando los conjuntos tienen diferentes tipos de datos, e informa de la diferencia en lugar de sólo en su defecto .
¿Cuál es la importación de isIn? IntelliJ no puede resolver la importación con ningún paquete de hamcret. – fabien
Me gusta la solución de Hans-Peter Störr ... Pero creo que no es del todo correcto. Tristemente containsInAnyOrder
no acepta un Collection
de objetos con los que comparar. Así que tiene que ser un Collection
de Matcher
s:
assertThat(set1, containsInAnyOrder(set2.stream().map(IsEqual::equalTo).collect(toList())))
La importación son:
import static java.util.stream.Collectors.toList;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.junit.Assert.assertThat;
- 1. @parameters en Junit 4
- 2. TestSuite Setup en jUnit 4
- 3. Suites paramétricas en Junit 4?
- 4. comparar archivos de texto con Junit
- 5. Las diferencias entre JUnit 3 y JUnit 4
- 6. Ejecutar todas las pruebas en Junit 4
- 7. comparar y ordenar diferentes tipos de objetos usando java Colecciones
- 8. ¿Manera fácil de comparar ArrayLists para la igualdad usando JUnit?
- 9. ¿Cómo puedo comparar archivos en un caso de prueba JUnit?
- 10. ¿Sigue siendo una buena práctica ejecutar pruebas con JUnit 3.x vs JUnit 4.x?
- 11. ¿Cómo uso JUnitPerf con JWebUnit y JUnit 4?
- 12. Prueba de excepciones múltiples con anotaciones JUnit 4
- 13. JUnit 4 @BeforeClass & @AfterClass cuando se utilizan Suites
- 14. Maven 2 No se ejecuta Junit 4 Pruebas
- 15. ¿Hay un equivalente de testNG's @BeforeSuite en JUnit 4?
- 16. Conjunto de pruebas Junit 4 y clases de prueba individuales
- 17. en ejecución "puros" JUnit 4 tests utilizando hormiga
- 18. ¿Por qué JUnit 4 en Android no funciona?
- 19. ¿Es posible excluir categorías múltiples en JUnit 4?
- 20. JUnit - assertSame
- 21. Java Commons Colecciones removeAll
- 22. Clojure: "=" compara valores en colecciones, ¿por qué no puede comparar dos listas en este caso?
- 23. ¿Cuál es la mejor manera de comparar dos colecciones en Java y actuar sobre ellas?
- 24. colecciones java vs mapa en colecciones framework
- 25. Agrupando pruebas de JUnit
- 26. junit annotation
- 27. Método protegido Junit
- 28. Cómo ejecutar todas las pruebas que pertenecen a una determinada categoría en JUnit 4
- 29. ¿Cómo agregar una prueba JUnit 4 que no se extiende desde TestCase a TestSuite?
- 30. No se puede ejecutar el caso de prueba JUnit 4 en el proyecto de Android Eclipse
cheque este SO enviar http://stackoverflow.com/questions/1086691/collectionassert-in-junit –
¿Estás tratando de afirmar que dos conjuntos son iguales entre sí (contienen los mismos elementos) o que dos elementos del mismo conjunto son iguales? –
Necesito ver que los elementos de dos conjuntos son iguales – Eqbal