60

Hamcrest 有没有办法比较一个数字范围内的数字?我正在寻找这样的东西:

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

4 回答 4

94

Jeff 解决方案的替代方法是使用both

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

我认为这很有可读性。如果检查失败,您还会收到一条很好的错误消息:

预期:是(大于 <50L> 且小于 <1658L> 的值)得到:<50L>

于 2012-10-08T16:50:10.937 回答
25

我不相信between它是核心 hamcrest 匹配器的一部分,但你可以这样做:

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

那还是有点难看,所以你可以在

assertThat(number, between(min,max))

看起来between

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

仍然不是一个很好的解决方案,但它读起来就像一个 hamcrest matcher。

如果您找不到公开可用的,编写自己的between匹配器http://code.google.com/p/hamcrest/wiki/Tutorial将是微不足道的。

于 2012-10-08T14:57:50.930 回答
16

如果您正在处理整数,则应考虑使用以下closeTo方法:

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

不幸的是,没有closeTo整数,但每个 32 位整数都可以用双精度表示,因此您可以简单地将它们转换为双精度,然后继续。

这并不完全等同于between,但有时会有所帮助。

于 2013-09-09T09:42:26.690 回答
2

另一种选择是使用Cirneco 扩展。它有between()betweenInclusive()还有更多。这些匹配器也适用于实现的其他对象Comparable(如Date)。

按照您的示例,它将是:

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

如果您希望包含两个边界:

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

或者,如果您只想包含其中一个边界:

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

您可以将以下依赖项用于符合 JDK7 的项目:

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

或者如果您使用的是 JDK8,请执行以下操作

<dependency>
  <groupId>it.ozimov</groupId>
  <artifactId>java8-hamcrest-matchers</artifactId>
  <version>0.7.0</version>
</dependency>
于 2015-12-30T13:54:38.833 回答