pom org matchers matcherassert libreria framework equalto dependency corematchers containsstring assertequals java hamcrest

java - org - Comparación de números de Hamcrest usando entre



libreria hamcrest java (4)

No creo que " between sea ​​parte del núcleo de los "hamcrest matchers", pero podrías hacer algo como esto:

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

Eso sigue siendo un poco feo, así que podrías crear un método de ayuda entre

assertThat(number, between(min,max))

y between looks como

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

Todavía no es una solución fantástica, pero se lee como un matcher matcher.

Si no puede encontrar uno que esté disponible públicamente, sería trivial escribir el suyo between asesor http://code.google.com/p/hamcrest/wiki/Tutorial .

¿Hay alguna manera en Hamcrest para comparar un número dentro de un rango numérico? Estoy buscando algo como esto:

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


Otra opción es usar la extensión Cirneco . Tiene between() , betweenInclusive() y más. Estas combinaciones también se aplican a otros objetos que implementen Comparable (como Date ).

Siguiendo tu ejemplo, será:

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

y si quieres que se incluyan los dos límites:

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

o si solo quiere que se incluya uno de los límites:

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

Puede usar la siguiente dependencia para un proyecto compatible con JDK7:

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

o lo siguiente si está usando JDK8

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


Si está tratando con enteros, debería considerar usar el método closeTo :

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

desafortunadamente, no hay closeTo para enteros, pero cada entero de 32 bits es representable por un doble, por lo que simplemente puedes convertirlos a dobles, y continuar.

Esto no es exactamente equivalente a between , pero a veces puede ser útil.


Una alternativa a la solución de Jeff es usar both :

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

Creo que es bastante legible. También recibe un buen mensaje de error en caso de que la verificación falle:

Esperado: es (un valor mayor que <50L> y un valor menor que <1658L>) obtenido: <50L>