Contexte
J'écris un simple JUnit test pour le MyObject
classe.
A MyObject
peut être créé à partir d'une méthode d'usine statique qui prend un varargue de Chaîne de caractères .
MyObject.ofComponents("Uno", "Dos", "Tres");
À tout moment au cours de l'existence de MyObject
les clients peuvent consulter les paramètres qui l'ont créé sous la forme d'un fichier de type Liste<E> par le biais de la .getComponents()
método.
myObject.ofComponents(); // -> List<String>: { "Uno", "Dos", "Tres" }
En d'autres termes, un MyObject
se souvient et expose la liste des paramètres qui l'ont fait naître. Plus de détails sur ce contrat :
- L'ordre de
getComponents
sera le même que celui choisi pour la création de l'objet - Duplicate subsequent Chaîne de caractères les composants sont autorisés et conservés afin
- Comportement sur
null
n'est pas définie (l'autre code ne garantit aucunenull
arrive à l'usine) - Il n'y a aucun moyen de modifier la liste des composants après l'instanciation de l'objet.
J'écris un test simple qui crée un MyObject
à partir d'une liste de Chaîne de caractères et vérifie qu'il peut retourner la même liste via .getComponents()
. Je le fais immédiatement, mais cela est censé se produire à distance dans un chemin de code réaliste. .
Code
Voici ma tentative :
List<String> argumentComponents = Lists.newArrayList("One", "Two", "Three");
List<String> returnedComponents =
MyObject.ofComponents(
argumentComponents.toArray(new String[argumentComponents.size()]))
.getComponents();
assertTrue(Iterables.elementsEqual(argumentComponents, returnedComponents));
Question
- Est Google Guava
Iterables.elementsEqual()
la meilleure façon, à condition d'avoir la bibliothèque dans mon chemin de construction, de comparer ces deux listes ? C'est une question qui me tourmente : dois-je utiliser cette méthode d'aide qui passe au-dessus d'un fichier de données ? Iterable<E> vérifier la taille et ensuite itérer en courant.equals()
ou toute autre méthode suggérée par une recherche sur Internet ? Quelle est la méthode canonique pour comparer des listes de tests unitaires ?
17 votes
+1 pour la question bien structurée.
1 votes
Hamcrest a
IsIterableContainingInOrder
qui est conçu exactement pour les tests, contrairement àIterables
. L'utilisation de Hamcrest donnera de bons messages en cas d'échec.0 votes
fest-assert fournit une élégante api...
0 votes
@JohnB : Hamcrest est génial et idéal pour les tests, ce qui est ce que je demandais (thx !), mais dans ce cas particulier
IsIterableContainingInOrder
n'est pas assez stricte, n'est-ce pas ?M={A,B,C}
contientN={A,B}
en ordre maisM!=N
.0 votes
@Robottinosino Selon la javadoc
Creates a matcher for Iterables that matches when a single pass over the examined Iterable yields a series of items, each logically equal to the corresponding item in the specified items. For a positive match, the examined iterable must be of the same length as the number of specified items
0 votes
Cela signifie (et je l'ai utilisé comme tel) que les deux listes doivent être de la même taille et que chaque élément doit correspondre. Je sais que le nom suggère que c'est un test plus faible, mais c'est ce que vous recherchez. Vous pouvez toujours confirmer en écrivant un test rapide en passant les listes de votre commentaire.