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);
}