Hamcrest 有没有办法比较一个数字范围内的数字?我正在寻找这样的东西:
assertThat(50L, is(between(12L, 1658L)));
Jeff 解决方案的替代方法是使用both
:
assertThat(50L, is(both(greaterThan(12L)).and(lessThan(1658L))));
我认为这很有可读性。如果检查失败,您还会收到一条很好的错误消息:
预期:是(大于 <50L> 且小于 <1658L> 的值)得到:<50L>
我不相信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将是微不足道的。
如果您正在处理整数,则应考虑使用以下closeTo
方法:
assertThat((double)nclient, is(closeTo(nserver, 1d)));
不幸的是,没有closeTo
整数,但每个 32 位整数都可以用双精度表示,因此您可以简单地将它们转换为双精度,然后继续。
这并不完全等同于between
,但有时会有所帮助。
另一种选择是使用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>