web-dev-qa-db-fra.com

Comment vérifier si la collection contient des éléments dans l'ordre donné en utilisant Hamcrest

Comment vérifier en utilisant Hamcrest si une collection donnée contient des éléments donnés dans un ordre donné? J'ai essayé hasItems mais il ignore simplement la commande.

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")); 
41
Mariusz Jamro

Vous pouvez utiliser contains matcher à la place, mais vous devez probablement utiliser la dernière version de Hamcrest. Cette méthode vérifie la commande.

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

Vous pouvez également essayer d'utiliser containsInAnyOrder si la commande ne vous concerne pas.

C'est le code pour contains matcher:

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

Pour vérifier que la collection contient des éléments dans l'ordre attendu (donné), vous pouvez utiliser la méthode containsInRelativeOrder de Hamcrest.

De javadoc:

Crée une correspondance pour les Iterables qui correspond quand un seul passage sur l'itrable examiné donne une série d'éléments, qui contient des éléments logiquement égaux à l'élément correspondant dans les éléments spécifiés, dans le même ordre relatif Par exemple: assertThat (Arrays.asList (" a "," b "," c "," d "," e "), contientInRelativeOrder (" b "," d ")).

Réel pour Java Hamcrest 2.0.0.0.

J'espère que cela t'aides.

7
nndru

Vous devez implémenter un Matcher personnalisé, quelque chose comme ça

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"));
}
2
Evgeniy Dorofeev

La réponse acceptée ne fonctionne pas pour moi. Il échoue toujours, disant

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

J'ai donc écrit mon propre IsIterableContainingInRelativeOrder, et l'a soumis comme patch .

1
Kevin Pauli

J'ai trouvé une solution sur http://www.baeldung.com/hamcrest-collections-arrays

Recherchez la section qui contient un exemple avec un ordre strict.

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

Fondamentalement, vous devez utiliser le contient Matcher (org.hamcrest.Matchers.contains)

1
Andreas Guther