que java idioms hamcrest

iterator java que es



¿Cuál es el patrón idiomático de Hamcrest para afirmar que cada elemento de un iterable coincide con un emparejador dado? (3)

El emparejador dado por David Harkness produce un mensaje agradable para la parte esperada . Sin embargo, el mensaje para la parte real también está determinado por el método assertThat que usa:

El de JUnit ( org.junit.Assert.assertThat ) produce la salida que proporcionó.

  • Con el not(hasItem(not(...))) :

    java.lang.AssertionError: Expected: not a collection containing not a string ending with "x" got: <[1x, 2x, 3x, 4z]>

  • Con el everyItem(...) :

    java.lang.AssertionError: Expected: every item is a string ending with "x" got: <[1x, 2x, 3x, 4z]>

El de Hamcrest ( org.hamcrest.MatcherAssert.assertThat ) produce el resultado dado por David:

  • Con el not(hasItem(not(...))) :

    java.lang.AssertionError: Expected: not a collection containing not a string ending with "x" but: was <[1x, 2x, 3x, 4z]>

  • Con el everyItem(...) :

    java.lang.AssertionError: Expected: every item is a string ending with "x" but: an item was "4z"

Mi propia experimentación con la afirmación de Hamcrest me mostró que la parte "pero" a menudo es confusa, dependiendo de cómo se combinan exactamente los distintos emparejadores y cuál falla primero, y por lo tanto sigo con la afirmación de JUnit, donde sé exactamente lo que yo Veremos en la parte "got".

Examine el siguiente fragmento de código:

assertThat( Arrays.asList("1x", "2x", "3x", "4z"), not(hasItem(not(endsWith("x")))) );

Esto afirma que la lista no tiene un elemento que no termina con "x". Esta, por supuesto, es la doble negación de decir que todos los elementos de la lista terminan con "x".

También tenga en cuenta que el recorte de tiros:

java.lang.AssertionError: Expected: not a collection containing not a string ending with "x" got: <[1x, 2x, 3x, 4z]>

Esto lista la lista completa, en lugar del elemento que no termina con "x".

Entonces, ¿hay una manera idiomática de:

  • Afirmando que cada elemento termina con "x" (sin dobles negativos)
  • En caso de error de aserción, liste solo aquellos elementos que no terminen con "x"

Está buscando todos los everyItem() :

assertThat( Arrays.asList("1x", "2x", "3x", "4z"), everyItem(endsWith("x")) );

Esto produce un mensaje de error agradable:

Expected: every item is a string ending with "x" but: an item was "4z"


Sé que esta pregunta es bastante antigua, pero hoy, con Java 8, prefiero escribirla con lambdas, por ejemplo

Stream.of("1x", "2x", "3x", "4z").allMatch(e->e.endsWith("x"));

Esta es la razón por.