test java collections hamcrest

java - test - junit assert contains list



Cómo verificar si la colección contiene elementos en un orden determinado usando Hamcrest (5)

¿Cómo verificar usando Hamcrest si la colección está conteniendo elementos dados en el orden dado? Intenté con hasItems pero simplemente ignora el orden.

List<String> list = Arrays.asList("foo", "bar", "boo"); assertThat(list, hasItems("foo", "boo")); //I want this to fail, because the order is different than in "list" assertThat(list, hasItems("boo", "foo"));


Encontré una solución en http://www.baeldung.com/hamcrest-collections-arrays

Busque la sección que tiene un ejemplo con orden estricto.

List<String> collection = Lists.newArrayList("ab", "cd", "ef"); assertThat(collection, contains("ab", "cd", "ef"));

Básicamente, necesita utilizar el contiene Matcher ( org.hamcrest.Matchers.contains )


La respuesta aceptada no funciona para mí. Todavía falla, diciendo

Expected: iterable containing ["foo", "boo"] but: Not matched: "bar"

Así que escribí mi propio IsIterableContainingInRelativeOrder y lo envié como un parche .


Necesita implementar un Matcher personalizado, algo como esto

class ListMatcher extends BaseMatcher { String[] items; ListMatcher(String... items) { this.items = items; } @Override public boolean matches(Object item) { List list = (List) (item); int l = -1; for (String s : items) { int i = list.indexOf(s); if (i == -1 || i < l) { return false; } l = i; } return true; } @Override public void describeTo(Description description) { // not implemented } } @Test public void test1() { List<String> list = Arrays.asList("foo", "bar", "boo"); Assert.assertThat(list, new ListMatcher("foo", "boo")); Assert.assertThat(list, new ListMatcher("boo", "foo")); }


Para verificar que la colección contiene elementos en el orden esperado (dado) puede usar el método containsInRelativeOrder de Hamcrest.

De javadoc:

Crea una coincidencia para Iterable que coincide cuando una sola pasada sobre Iterable examinada produce una serie de elementos, que contiene elementos lógicamente iguales al elemento correspondiente en los elementos especificados, en el mismo orden relativo. Por ejemplo: assertThat (Arrays.asList (" a "," b "," c "," d "," e "), containsInRelativeOrder (" b "," d ")).

Actual para Java Hamcrest 2.0.0.0.

Espero que esto ayude.


Puede usar contains matcher en su lugar, pero probablemente necesite usar la última versión de Hamcrest. Ese método verifica el orden.

assertThat(list, contains("foo", "boo"));

También puede intentar usar containsInAnyOrder si el orden no le importa.

Ese es el código para contains matcher:

public static <E> Matcher<Iterable<? extends E>> contains(List<Matcher<? super E>> itemMatchers) { return IsIterableContainingInOrder.contains(itemMatchers); }