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