【发布时间】:2012-10-08 14:02:56
【问题描述】:
Hamcrest 有没有办法比较一个数字范围内的数字?我正在寻找这样的东西:
assertThat(50L, is(between(12L, 1658L)));
【问题讨论】:
Hamcrest 有没有办法比较一个数字范围内的数字?我正在寻找这样的东西:
assertThat(50L, is(between(12L, 1658L)));
【问题讨论】:
Jeff 的解决方案的替代方法是使用both:
assertThat(50L, is(both(greaterThan(12L)).and(lessThan(1658L))));
我认为这很有可读性。如果检查失败,您还会收到一条很好的错误消息:
预期:是(大于 且小于 的值) 得到:
【讨论】:
我不相信 between 是核心 hamcrest 匹配器的一部分,但你可以这样做:
assertThat(number, allOf(greaterThan(min),lessThan(max)));
这还是有点难看,所以你可以在它们之间创建一个辅助方法
assertThat(number, between(min,max))
和between 看起来像
allOf(greaterThan(min),lessThan(max))
仍然不是一个很好的解决方案,但它读起来就像一个 hamcrest 匹配器。
如果您找不到公开可用的,编写自己的between matcher http://code.google.com/p/hamcrest/wiki/Tutorial 将是微不足道的。
【讨论】:
如果您正在处理整数,您应该考虑使用closeTo 方法:
assertThat((double)nclient, is(closeTo(nserver, 1d)));
不幸的是,整数没有closeTo,但是每个 32 位整数都可以用双精度表示,因此您可以简单地将它们转换为双精度,然后继续。
这并不完全等同于 between,但有时会有所帮助。
【讨论】:
另一种选择是使用Cirneco extension。它有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>
【讨论】: