Supposons que je souhaite tester une méthode avec cette signature:
List<MyItem> getMyItems();
Présumer MyItem
c'est un Pojo qui a de nombreuses propriétés, dont l'une est "name"
accessible via getName()
.
Tout ce que je tiens à vérifier, c'est que le List<MyItem>
, ou un Iterable
, contient deux MyItem
instances, dont"name"
propriétés ont les valeurs "foo"
et "bar"
. Si d'autres propriétés ne correspondent pas, je ne me soucie pas vraiment des objectifs de ce test. Si les noms correspondent, c'est un test réussi.
Je voudrais que ce soit une ligne si possible. Voici une "pseudo-syntaxe" du genre de chose que je voudrais faire.
assert(listEntriesMatchInAnyOrder(myClass.getMyItems(), property("name"), new String[]{"foo", "bar"});
Hamcrest serait-il bon pour ce genre de chose? Si oui, quelle serait exactement la version hamcrest de ma pseudo-syntaxe ci-dessus?
la source
Ce n'est pas spécialement Hamcrest, mais je pense qu'il vaut la peine de le mentionner ici. Ce que j'utilise assez souvent en Java8, c'est quelque chose comme:
(Modifié à la légère amélioration de Rodrigo Manyari. C'est un peu moins verbeux. Voir les commentaires.)
C'est peut-être un peu plus difficile à lire, mais j'aime le type et la sécurité de refactoring. C'est également cool pour tester plusieurs propriétés de haricot en combinaison. par exemple avec une expression && de type java dans le filtre lambda.
la source
Assertj est bon dans ce domaine.
Le gros plus pour assertj par rapport à hamcrest est l'utilisation facile de la complétion de code.
la source
AssertJ fournit une excellente fonctionnalité dans
extracting()
: vous pouvez passer desFunction
s pour extraire des champs. Il fournit une vérification au moment de la compilation.Vous pouvez également affirmer la taille en premier facilement.
Cela donnerait:
containsExactlyInAnyOrder()
affirme que la liste ne contient que ces valeurs quel que soit l'ordre.Pour affirmer que la liste contient ces valeurs quel que soit l'ordre mais peut également contenir d'autres valeurs, utilisez
contains()
:En remarque: pour affirmer plusieurs champs à partir d'éléments de a
List
, avec AssertJ, nous le faisons en enveloppant les valeurs attendues pour chaque élément dans unetuple()
fonction:la source
Tant que votre List est une classe concrète, vous pouvez simplement appeler la méthode contains () tant que vous avez implémenté votre méthode equals () sur MyItem.
Supposons que vous ayez implémenté un constructeur qui accepte les valeurs sur lesquelles vous souhaitez affirmer. Je me rends compte que ce n'est pas sur une seule ligne, mais il est utile de savoir quelle valeur manque plutôt que de vérifier les deux à la fois.
la source
AssertJ 3.9.1 prend en charge l'utilisation directe des prédicats dans la
anyMatch
méthode.C'est un cas d'utilisation généralement approprié pour une condition arbitrairement complexe.
Pour les conditions simples, je préfère utiliser la
extracting
méthode (voir ci-dessus) car le résultat du test itérable sous test peut prendre en charge la vérification de la valeur avec une meilleure lisibilité. Exemple: il peut fournir une API spécialisée telle que lacontains
méthode dans la réponse de Frank Neblung. Ou vous pouvez l'appeleranyMatch
plus tard de toute façon et utiliser une référence de méthode telle que"searchedvalue"::equals
. De plus, plusieurs extracteurs peuvent être mis enextracting
méthode, le résultat étant ensuite vérifié à l'aidetuple()
.la source