Question

Is there a way in Hamcrest to compare a number within a number range? I am looking for something like this:

assertThat(50L, is(between(12L, 1658L)));
Was it helpful?

Solution

An alternative to Jeff's solution is to use both:

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

I think that's quite readable. You also get a good error message in case the check failed:

Expected: is (a value greater than <50L> and a value less than <1658L>) got: <50L>

OTHER TIPS

I don't believe between is part of the core hamcrest matchers, but you could do something like this:

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

That's still a little ugly, so you could create a helper method between

assertThat(number, between(min,max))

and between looks like

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

Still not a fantastic solution, but it reads like a hamcrest matcher.

If you can't find one that's publicly available, it would be trivial to write your own between matcher http://code.google.com/p/hamcrest/wiki/Tutorial.

If you're dealing with integers, you should consider using the closeTo method:

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

unfortunately, there's no closeTo for integers, but every 32 bit integer is representable by a double, so you can simply cast them to doubles, and carry on.

This is not exactly equivalent to between, but can sometimes be helpful.

Another option is to use the Cirneco extension. It has between(), betweenInclusive() and more. These matchers also apply to other objects that implements Comparable (like Date).

Following your example, it will be:

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

and if you want the two bounds to be included:

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

or if you want just one of the bounds to be included:

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

You can use the following dependency for a JDK7-compliant project:

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

or the following if you are using JDK8

<dependency>
  <groupId>it.ozimov</groupId>
  <artifactId>java8-hamcrest-matchers</artifactId>
  <version>0.7.0</version>
</dependency>
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top