Hamcrest number comparison using between

2020-08-09 07:43发布

问题:

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)));

回答1:

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>



回答2:

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.



回答3:

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.



回答4:

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>


标签: java hamcrest