11
votes

Hamcrest Collections égales

Y a-t-il un matcheur dans Hamcrest pour comparer les collections pour l'égalité? Il y a contient et contenant) mais j'ai besoin égale non liée au type de collecte de béton. Par exemple. Je ne peux pas comparer les arrayes.Aslist et map.Values ​​avec HamCrest Equals .

Merci d'avance!


2 commentaires

Voir aussi Stackoverflow.com/q/2509293/21499


Arrays.Aslist (). Equals (nouveau hashmap <> (). valeurs ()) == FAUX Liste s et SET s ne sont jamais égal à l'autre.


3 Réponses :


7
votes

Je ne peux pas comparer les tableaux.Aslist et Carte.Values ​​avec Hamcrest équivaut.

Ceci est dû aux signatures de type trop zélé de Hamcrest. Vous peut faire cette comparaison sur l'égalité, mais vous devez faire appel à la liste objet à collection avant de compiler.

Je dois souvent faire casting avec Hamcrest, ce qui se passe tort, mais c'est le seul moyen de l'obtenir pour compiler parfois.


0 commentaires

4
votes

Le casting à une collection peut fonctionner, mais cela rend certaines hypothèses sur les implémentations de la collecte sous-jacente (par exemple, la commande?). Une approche plus générale serait d'écrire votre propre matcheur.

Voici une implémentation de correspondance presque complète qui fait ce que vous voulez (vous aurez besoin de remplir la méthode des importations et des décrites). Notez que cette mise en œuvre nécessite que tous les éléments de deux collections soient égaux, mais pas nécessairement dans le même ordre. P>

public class IsCollectionOf<T> extends TypeSafeMatcher<Collection<T>> {
    private final Collection<T> expected;
    public IsCollectionOf(Collection<T> expected) {
        this.expected = expected;
    }
    public boolean matchesSafely(Collection<T> given) {
        List<T> tmp = new ArrayList<T>(expected);
        for (T t : given) {
            if (!tmp.remove(t)) {
                return false;
            }
        return tmp.isEmpty();
    }
    // describeTo here
    public static <T> Matcher<Collection<T>> ofItems(T... items) {
        return new IsCollectionOf<T>(Arrays.asList(items));
    }
}


0 commentaires

1
votes

Si vous avez des problèmes avec la méthode Equals de la mise en œuvre des collections, vous pouvez également copier les collections:

assertThat(actual, both(everyItem(isIn(expected))).and(containsInAnyOrder(expected)));


0 commentaires