validator updated update org necesario marcado hentry hatom falta estructurados error entry elemento datos java unit-testing junit hamcrest matcher

java - updated - ¿Por qué este código que intenta utilizar los artículos hasItems de Hamcrest no se compila?



microformats validator (9)

Acabo de toparme con este post tratando de arreglarlo por mí mismo. Me dio la información suficiente para resolverlo.

Puede dar al compilador lo suficiente como para convencerlo de compilar al convertir el valor de retorno de hasItems a un Matcher (sin procesar), por ejemplo:

ArrayList<Integer> actual = new ArrayList<Integer>(); ArrayList<Integer> expected = new ArrayList<Integer>(); actual.add(1); expected.add(2); assertThat(actual, (Matcher) hasItems(expected));

Por si acaso alguien más todavía está sufriendo ...

Editar para agregar: a pesar de los votos al alza, esta respuesta es incorrecta, como señala Arend a continuación. La respuesta correcta es convertir lo esperado en una matriz de enteros, como hamcrest espera:

ArrayList<Integer> actual = new ArrayList<Integer>(); ArrayList<Integer> expected = new ArrayList<Integer>(); actual.add(1); expected.add(2); assertThat(actual, hasItems(expected.toArray(new Integer[expected.size()])));

¿Por qué esto no compila, oh, qué hacer?

import static org.junit.Assert.assertThat; import static org.junit.matchers.JUnitMatchers.hasItems; ArrayList<Integer> actual = new ArrayList<Integer>(); ArrayList<Integer> expected = new ArrayList<Integer>(); actual.add(1); expected.add(2); assertThat(actual, hasItems(expected));

error copiado de un comentario:

cannot find symbol method assertThat(java.util.ArrayList<java.lang.Integer>, org.hamcreset.Matcher<java.lang.Iterable<java.util.ArrayList<java.lang.Integer>>>)


Ese mensaje de error se parece a uno producido por el compilador javac. He encontrado en el pasado que el código escrito usando hamcrest simplemente no se compilará bajo javac. El mismo código se compilará correctamente en, por ejemplo, el compilador de Eclipse.

Creo que los genéricos de Hamcrest están ejerciendo casos de esquina en genéricos con los que javac no puede lidiar.


Está comparando ArrayList<Integer> con int . La comparación correcta es:

... assertThat(actual, hasItem(2));

- Editar -

Lo siento, lo he leído mal. De todos modos, la firma de hasItems que desea es:

public static <T> org.hamcrest.Matcher<java.lang.Iterable<T>> hasItems(T... elements)

es decir, acepta una cantidad variable de argumentos. No estoy seguro de si una ArrayList<T> es compatible, solo adivino aquí. Intente enviar cada elemento de la lista esperada intercalada con una coma.

assertThat(actual, hasItems(2,4,1,5,6));

- Editar 2 -

Al pegar aquí mi comentario, hay una expresión equivalente para lo que quieres, sin usar Hamcrest:

assertTrue(actual.containsAll(expected));


Me encontré con el mismo problema y el siguiente truco funcionó para mí:

  • use import static org.hamcrest.Matchers.hasItems
  • tener la biblioteca de hamcrest antes de junit en classpath (ruta de compilación -> orden y exportación)

Para estos casos, cuando el código se compila en Eclipse pero javac muestra errores, por favor ayude a hamcrest proporcionando explícitamente un parámetro de tipo, por ejemplo, Matchers.hasItem ()


Puede obtener este error si intenta reemplazar el hamcrest de jUnit con una versión más nueva. Por ejemplo, usar junit-dep junto con hamcrest 1.3 requiere que use assertThat de hamcrest en lugar de jUnit.

Entonces la solución es usar

import static org.hamcrest.MatcherAssert.assertThat;

en lugar de

import static org.junit.Assert.assertThat;


Tratar

assertThat(actual, hasItems(expected.toArray(new Integer[0])));

para satisfacer la firma del emparejador. No hay eclipse alrededor, por lo que esto podría no funcionar.


hasItems verifica que una colección contenga algunos elementos, no que 2 colecciones sean iguales, solo usa las aserciones normales de igualdad para eso. Entonces assertEquals (a, b) o usando assertThat

import static org.junit.Assert.assertThat; import static org.hamcrest.CoreMatchers.is; ArrayList<Integer> actual = new ArrayList<Integer>(); ArrayList<Integer> expected = new ArrayList<Integer>(); actual.add(1); expected.add(2); assertThat(actual, is(expected));

Alternativamente, use el contiene Matcher, que verifica que un Iterable contenga elementos en un orden específico

import static org.junit.Assert.assertThat; import static org.hamcrest.Matchers.contains; ArrayList<Integer> actual = new ArrayList<Integer>(); actual.add(1); actual.add(2); assertThat(actual, contains(1, 2)); // passes assertThat(actual, contains(3, 4)); // fails

Si no le importa el orden, use containsInAnyOrder lugar.


ArrayList<Integer> expected = new ArrayList<Integer>(); expected.add(1); expected.add(2); hasItems(expected);

hasItems (T..t) está siendo expandido por el compilador a:

hasItems(new ArrayList<Integer>[]{expected});

Está pasando una única matriz de elementos que contiene una ArrayList. Si cambia ArrayList a una matriz, su código funcionará.

Integer[] expected = new Integer[]{1, 2}; hasItems(expected);

Esto se expandirá a:

hasItems(1, 2);