web-dev-qa-db-fra.com

Comparaison des nombres Hamcrest en utilisant entre

Existe-t-il un moyen dans Hamcrest de comparer un nombre dans une plage de nombres? Je cherche quelque chose comme ça:

assertThat(50L, is(between(12L, 1658L)));
51
saw303

Une alternative à la solution de Jeff consiste à utiliser both:

assertThat(50L, is(both(greaterThan(12L)).and(lessThan(1658L))));

Je pense que c'est assez lisible. Vous obtenez également un bon message d'erreur en cas d'échec de la vérification:

Attendu: est (une valeur supérieure à <50L> et une valeur inférieure à <1658L>) obtenu: <50L>

78
Christoph Leiter

Je ne crois pas que between fait partie des principaux matchers hamcrest, mais vous pouvez faire quelque chose comme ceci:

assertThat(number, allOf(greaterThan(min),lessThan(max)));

C'est encore un peu moche, vous pouvez donc créer une méthode d'aide entre

assertThat(number, between(min,max))

et between ressemble

allOf(greaterThan(min),lessThan(max))

Ce n'est toujours pas une solution fantastique, mais ça se lit comme un match nul.

Si vous ne trouvez pas celui qui est accessible au public, il serait trivial d'écrire votre propre between matcher http://code.google.com/p/hamcrest/wiki/Tutorial .

24
Jeff Storey

Si vous avez affaire à des entiers, vous devriez envisager d'utiliser la méthode closeTo:

assertThat((double)nclient, is(closeTo(nserver, 1d)));

malheureusement, il n'y a pas de closeTo pour les entiers, mais chaque entier 32 bits est représentable par un double, vous pouvez donc simplement les convertir en doubles et continuer.

Ce n'est pas exactement équivalent à between, mais peut parfois être utile.

16
Elazar Leibovich

Une autre option consiste à utiliser extension Cirneco . Il a between(), betweenInclusive() et plus encore. Ces matchers s'appliquent également à d'autres objets qui implémentent Comparable (comme Date).

Suivant votre exemple, ce sera:

assertThat(50L, between(12L, 1658L));  

et si vous voulez que les deux limites soient incluses:

assertThat(50L, betweenIncluded(12L, 1658L));  

ou si vous souhaitez inclure une seule des limites:

assertThat(50L, betweenLowerBoundIncluded(12L, 1658L));  
assertThat(50L, betweenUpperBoundIncluded(12L, 1658L));  

Vous pouvez utiliser la dépendance suivante pour un projet compatible JDK7:

<dependency>
  <groupId>it.ozimov</groupId>
  <artifactId>Java7-hamcrest-matchers</artifactId>
  <version>0.7.0</version>
</dependency>

ou ce qui suit si vous utilisez JDK8

<dependency>
  <groupId>it.ozimov</groupId>
  <artifactId>Java8-hamcrest-matchers</artifactId>
  <version>0.7.0</version>
</dependency>
2
JeanValjean